在多索引panda数据帧中添加列



我有一个多索引数据帧和一个字典。这个字典的一些键和第一个子列的一些值重合。我想根据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])

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

有人能帮我吗?

您可以将MultiIndex转换为具有to_frame的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

最新更新