如何基于字典值列表匹配将字典键转为DataFrame列
解决方法
首先最简洁高效的方式是先把原字典转换成值到键的反向映射,这样就能直接用map方法快速匹配:
步骤1:构建反向映射字典
dict_x = {1: ['a'], 2: ['b', 'c', 'e'], 3: ['d', 'f']} # 反转字典,让每个字符串对应唯一的数字键 reverse_map = {val: key for key, vals in dict_x.items() for val in vals}
步骤2:给DataFrame新增列
注意原示例里的df写法有误,正确的DataFrame初始化方式如下:
import pandas as pd df = pd.DataFrame({'ID': ['a', 'b', 'c', 'd', 'e', 'f']}) df['Number'] = df['ID'].map(reverse_map)
运行后得到目标结果:
ID Number 0 a 1 1 b 2 2 c 2 3 d 3 4 e 2 5 f 3
用apply实现的写法
如果一定要用apply,可以在lambda中遍历字典键值对,找到包含当前ID的列表对应的键:
df['Number'] = df['ID'].apply(lambda x: next(key for key, vals in dict_x.items() if x in vals))
这里用next()是因为每个ID只会匹配到一个键,能直接拿到对应结果。
为什么循环会只保留最后一次结果?
你之前的循环应该是直接给整列赋值,比如这种错误写法:
# 错误示范:每次循环覆盖整列,最终只保留最后一次迭代的赋值 for key, vals in dict_x.items(): df['Number'] = df['ID'].isin(vals).map({True: key, False: None})
正确的循环写法需要精准定位匹配行再赋值:
df['Number'] = None for key, vals in dict_x.items(): df.loc[df['ID'].isin(vals), 'Number'] = key
不过这种写法效率远低于反向映射的map,数据量大时差距更明显。
内容的提问来源于stack exchange,提问作者blake
相关产品推荐
相关产品推荐

