【问题标题】:Add column in a multindex panda dataframe在多索引熊猫数据框中添加列
【发布时间】:2020-04-11 01:49:37
【问题描述】:

我有一个多索引数据框和一个字典。该字典的某些键和第一个子列的某些值重合。我想根据 query_name 值添加一个包含我的字典值的新列。

这是我的数据框


                                          S_genus
query_name                                       
GCA_000237975.1 g__Sulfobacillus_A          118.0
GCA_000307585.2 g__Thermoanaerobacterium    118.0
                g__Thermoanaerobacter         1.0
                g__Ruminiclostridium_F        1.0
GCA_000404785.1 g__Cloacimonetes-1            1.0
...                                           ...
GCF_900141705.1 g__Fibrobacter              116.0
GCF_900142435.1 g__Thermocrinis_A           113.0
GCF_900175965.1 g__Rubrobacter              116.0
GCF_900176285.1 g__Desulfacinum             118.0
GCF_900215515.1 g__Persephonella            118.0

这里是我的字典

acc2genus

 'GCF_001658645.1': 'g__Staphylococcus',
 'GCF_900117665.1': 'g__Acinetobacter',
 'GCF_000652055.1': 'g__Mycobacterium',
 'GCF_003037025.1': 'g__Klebsiella',
 'GCF_002138225.1': 'g__Acinetobacter',
 'GCF_001186785.1': 'g__Vibrio',
 'GCF_001671475.1': 'g__Mesorhizobium',
 'GCF_000153745.1': 'g__Amylibacter_A',
 'GCF_002814015.1': 'g__Klebsiella', 

我尝试过这样的事情:

rdf["S_genus", "nueva"] = rdf["S_genus"].apply(lambda x: acc2genus[x])

我尝试了很多次,但出现错误或丢失了第三个子列(数字)。

谁能帮帮我?

【问题讨论】:

标签: python pandas


【解决方案1】:

您可以使用 to_frame 将 MultiIndex 转换为 DataFrame,通过其标签 (query_name) 选择第一级,然后使用字典通过列表解析来翻译每个值:

import pandas as pd

# example data frame, simplified
rdf = pd.DataFrame({'S_genus': [118.0, 118.0, 1.0, 1.0]}, 
                   index = pd.MultiIndex.from_tuples(
                              [('GCA_000237975.1', 'g__Sulfobacillus_A'), 
                               ('GCA_000307585.2', 'g__Thermoanaerobacterium'), 
                               ('GCA_000307585.2', 'g__Thermoanaerobacter'), 
                               ('GCA_000307585.2', 'g__Ruminiclostridium_F ')]))
rdf.index.names = ['query_name', '']

# example dictionary, simplified
acc2genus = dict({'GCA_000237975.1': 'Sulfo', 
                  'GCA_000307585.2': 'Thermo'})

# new column: values from first index level translated via dictionary
rdf['nueva'] = [acc2genus[rdf.index.to_frame()['query_name'].values[i]] 
                for i in range(len(rdf))]
rdf
                                              S_genus   nueva
query_name          
GCA_000237975.1     g__Sulfobacillus_A        118.0     Sulfo
GCA_000307585.2     g__Thermoanaerobacterium  118.0     Thermo
                    g__Thermoanaerobacter       1.0     Thermo
                    g__Ruminiclostridium_F      1.0     Thermo

【讨论】:

  • 非常感谢。这正是我想要的。这适用于我的数据
  • 感谢您告诉我。
猜你喜欢
  • 1970-01-01
  • 2017-04-06
  • 2021-12-19
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 2022-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多