首页 > 解决方案 > 如果值列表中的一个在行中匹配,如何将字典的键“反向映射”到行?

问题描述

有这个列表,其中包括列、年份和标准。还有一个标签字典(键),每个标签都有一个标准(值)列表。我想在标准与值列表中的一个条目匹配的每一行添加一个标签。

举个例子:

import pandas as pd 

labels_dict = {'label_1': [1,2],
         'label_2': [4,6]}

df = pd.DataFrame({'year':[2014,2014,2015,2015,2016,2016], 
                   'criterion':[1,2,3,4,5,6]})

>>> print(df)
   year  criterion
0  2014          1
1  2014          2
2  2015          3
3  2015          4
4  2016          5
5  2016          6


target_labels = pd.DataFrame({'labels': ['label_1', 'label_1', pd.NaT, 'label_2', pd.NaT, 'label_2']})

target_df = pd.concat([df, target_labels], axis=1)

>>> print(target_df)
   year  criterion   labels
0  2014          1  label_1
1  2014          2  label_1
2  2015          3      NaT
3  2015          4  label_2
4  2016          5      NaT
5  2016          6  label_2

一些注意事项:

标签字典是我能想到的最好的主意,但由于我手动创建它,我可以使用不同的对象。

我尝试失败(每个循环都会覆盖整个列):

for key in labels_dict.keys():
    df['labels'] = df.loc[df['criterion'].isin(labels_dict[key]), :]['year'].apply(lambda x: key)

切换键和值labels_dict不起作用,因为列表是不可散列的。

标签: pythonpandasdataframe

解决方案


最简单的方法是创建一个反向字典和映射:

reverse_label = {x:k for k,v in labels_dict.items() for x in v}

df['labels'] = df['criterion'].map(reverse_label)

输出:

   year  criterion   labels
0  2014          1  label_1
1  2014          2  label_1
2  2015          3      NaN
3  2015          4  label_2
4  2016          5      NaN
5  2016          6  label_2

推荐阅读