You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于字典值列表匹配将字典键转为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 08:54:22