如何使用dictionary与isin()为DataFrame生成匹配字典值的分类列?
解决方案:用字典结合
isin()给DataFrame新增分类列 嘿,这个需求很常见,用isin()配合numpy.select就能完美解决,我给你一步步说明怎么做:
1. 先准备好你的数据
首先确保字典和DataFrame的定义正确,注意Value列的类型要和字典里的值类型一致(这里都是字符串):
import pandas as pd import numpy as np # 你的原始字典 d = {'Car':['1','2','3'], 'Chicken legs':['4','5','6'], 'Coronary artery bypass graft surgery':['7','8','9','10','11','12']} # 你的原始DataFrame df = pd.DataFrame({ 'Color': ['red', 'blue', 'green', 'orange'], 'Style': ['round', 'square', 'triangle', 'sphere'], 'Value': ['1', '5', '9', '12'] })
2. 用isin()构建匹配条件+新增列
核心思路是:为字典的每个Key生成一个布尔条件(判断Value是否在对应的值列表里),然后用np.select把匹配的Key赋值给新列:
# 生成条件列表:每个元素是一个布尔数组,标记该行Value是否属于对应字典值列表 conditions = [df['Value'].isin(vals) for vals in d.values()] # 生成对应的分类值(就是字典的Key) choices = list(d.keys()) # 新增Thing列:根据第一个满足的条件匹配对应Key,无匹配则设为None df['Thing'] = np.select(conditions, choices, default=None)
3. 最终结果
运行完上面的代码后,你的DataFrame会变成这样:
| Color | Style | Value | Thing |
|---|---|---|---|
| red | round | 1 | Car |
| blue | square | 5 | Chicken legs |
| green | triangle | 9 | Coronary artery bypass graft surgery |
| orange | sphere | 12 | Coronary artery bypass graft surgery |
几个注意点
- 类型一致性:如果你的
df['Value']是数字类型,记得把字典里的值也改成数字(比如['1','2']改成[1,2]),否则isin()会匹配失败。 - 重复匹配处理:如果某个Value同时出现在多个字典值列表里,
np.select会优先选择第一个匹配的Key(Python 3.7+的字典是有序的,所以顺序和你定义字典时一致)。 - 默认值:如果有Value不在任何字典值列表里,
default参数可以设置你想要的默认值(比如'Unknown')。
内容的提问来源于stack exchange,提问作者CandleWax
相关产品推荐
相关产品推荐

