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

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的结果:

var1cat
香蕉水果
萝卜蔬菜
橙子水果
西瓜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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:50:15