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符合预期:
| Name | Note | C |
|---|---|---|
| Tom | The color is red | One |
| nick | This is a white blouse | Two |
| krish | I love the blue hoodie | Three |
| jack | What 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
相关产品推荐
相关产品推荐

