Pandas中如何将字典列表值映射到DataFrame生成新列?
解决方法:匹配字典列表元素生成DataFrame新列
你遇到的问题很典型——map() 默认是用Series的值去匹配字典的键,但你的字典结构是「键对应取值列表」,方向刚好反了,所以直接用原字典map会返回NaN。下面给你两种可行的方案,分别适合不同场景:
方案1:重构字典后用map(推荐,效率更高)
先把原字典转换成「列表元素→对应键」的映射结构,这样就能直接用map()做向量化匹配,速度比逐行判断快很多,适合大数据量的场景:
import pandas as pd # 示例数据 dict_cat = {"水果": ["苹果", "香蕉", "橙子"], "蔬菜": ["白菜", "萝卜", "黄瓜"]} df = pd.DataFrame({"var1": ["香蕉", "萝卜", "橙子", "西瓜"]}) # 重构字典:将每个列表元素映射到对应的键 reverse_map = {} for category, items in dict_cat.items(): for item in items: reverse_map[item] = category # 用map生成新列 df["cat"] = df["var1"].map(reverse_map)
运行后df的结果:
| var1 | cat |
|---|---|
| 香蕉 | 水果 |
| 萝卜 | 蔬菜 |
| 橙子 | 水果 |
| 西瓜 | NaN |
方案2:自定义函数+map/apply(无需重构字典)
如果不想修改原字典结构,可以写一个自定义函数,让map()调用这个函数逐行判断元素是否在字典的列表中:
def get_category(item): for category, items in dict_cat.items(): if item in items: return category return None # 没有匹配到返回None,也可以改成你需要的默认值 df["cat"] = df["var1"].map(get_category)
或者用更简洁的lambda表达式(可读性稍差,但代码短):
df["cat"] = df["var1"].map(lambda x: next((k for k, v in dict_cat.items() if x in v), None))
两种方案对比
- 方案1:一次遍历字典构建映射,之后用向量化的
map()处理,时间复杂度低,适合大DataFrame或大字典。 - 方案2:每一行都要遍历整个字典,时间复杂度更高,但不需要修改原字典结构,适合小数据量或临时场景。
内容的提问来源于stack exchange,提问作者topcat
相关产品推荐
相关产品推荐

