python - 如果值列表中的一个在行中匹配,如何将字典的键“反向映射”到行?
问题描述
有这个列表,其中包括列、年份和标准。还有一个标签字典(键),每个标签都有一个标准(值)列表。我想在标准与值列表中的一个条目匹配的每一行添加一个标签。
举个例子:
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
不起作用,因为列表是不可散列的。
解决方案
最简单的方法是创建一个反向字典和映射:
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
推荐阅读
- postgresql - 如何使用验证批量导入并使用 paper_trail 创建版本?
- javascript - JavaScript中从当前日期到分钟的时间差
- javascript - 移动响应式菜单放置
- postgresql - 具有 UNIQUE 约束的重复记录
- amazon-web-services - 如何使用不同的环境变量在 AWS ECS 上安排多个任务?
- ansible - 如何根据变量中定义的主机名在多个主机中执行任务
- spring-webflux - Spring Webflux 使用 DataBuffer 将 WebClient.exchange() 迁移到 WebClient.exchangeToMono()
- mechanicalturk - 创建包含 Mturk“workerId”但在 Turkprime(Cloudresearch)中称为“participant_label”的外部链接
- python - 连续说出 nsfw 单词 3 次后如何使不和谐机器人静音用户
- c# - 谁在显示 ContextMenu:表单还是通知图标?