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

Python中如何用字典value匹配DataFrame列内容并返回对应key生成新列

问题原因

你当前的实现每次循环都会对整个C列重新赋值,前几次循环匹配到的结果会被后续循环直接覆盖,同时你写的np.where缺少第三个else参数,语法存在缺陷,因此无法得到预期结果。

正确实现方法

推荐优先用无循环的向量化方案,效率更高也更易维护:

import pandas as pd
import numpy as np

# 原有基础数据
data = {'Name':['Tom', 'nick', 'krish', 'jack'],
        'Note':['The color is red', 'This is a white blouse', 'I love the blue hoodie', 'What is that orange box?']}
df = pd.DataFrame(data)
F={'One':'red','Two':'white', 'Three':'blue', 'Four':'orange'}

# 1. 反转字典,得到「颜色:对应标签」的映射关系
color_to_tag = {v:k for k,v in F.items()}
# 2. 构建正则匹配模式,覆盖所有待检索的颜色词
pattern = '|'.join(color_to_tag.keys())
# 3. 从Note列提取匹配到的颜色,映射为对应标签后赋值给C列
df['C'] = df['Note'].str.extract(f'({pattern})', expand=False).map(color_to_tag)

运行后得到的df符合预期:

NameNoteC
TomThe color is redOne
nickThis is a white blouseTwo
krishI love the blue hoodieThree
jackWhat is that orange box?Four

如果你一定要基于循环逻辑修改也可以,先初始化C列为空值,每次循环仅给未匹配到结果的行赋值,避免覆盖历史结果:

# 先初始化C列为空值
df['C'] = np.nan
for tag, color in F.items():
    # 仅给C列为空、且Note包含当前颜色的行赋值
    mask = df['C'].isna() & df['Note'].str.contains(color)
    df.loc[mask, 'C'] = tag

补充说明

  • 如果某行Note包含多个颜色词,上述str.extract方案默认返回第一个匹配到的颜色对应的标签,需要返回所有匹配结果可自行调整逻辑
  • 如果存在无匹配颜色的行,C列对应位置会是空值,可根据需求用fillna补充默认值

内容的提问来源于stack exchange,提问作者Shang Lu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:15:07