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

Pandas遍历DataFrame列匹配字典键替换值异常求助

问题描述

我尝试遍历DataFrame中的id列,当该列的值匹配字典的键时,将Full列为“Yes”的行的Cat列替换为对应字典的值。

代码如下:

df = pd.DataFrame({'id': ['123', '456', '789'], 'Full': ['Yes', 'No', 'Yes'], 'Cat':['','','']})
cats = {'123':'A', '456':'B', '789':'C'}
for val in df.id:
    for key, cat in cats.items():
        if key == val:
            df.Cat.loc[(df.Full == 'Yes')] = cat
df

运行后得到的结果为:

id  Full Cat
0   123 Yes  C
1   456 No  
2   789 Yes  C

预期id为123的行Cat列值为“A”,但实际结果中该列值为“C”,请问为何字典的键未被正确遍历匹配?

问题原因

你的代码逻辑存在关键问题:每次匹配到id与字典键相等时,执行的df.Cat.loc[(df.Full == 'Yes')] = cat会把所有Full为“Yes”的行的Cat列全部覆盖为当前的cat值。

具体执行流程:

  • 第一次循环val=123,匹配到key=123,此时把行0和行2的Cat设为“A”;
  • 第二次循环val=456,匹配到key=456,但该行Full为“No”,所以没有修改;
  • 第三次循环val=789,匹配到key=789,此时把行0和行2的Cat全部覆盖为“C”;
  • 最终所有Full为“Yes”的行Cat值都变成了最后一次循环的“C”。
正确解法

方法1:精准定位修改行(循环版)

直接通过布尔索引同时筛选id匹配和Full为“Yes”的行,避免全量修改:

df = pd.DataFrame({'id': ['123', '456', '789'], 'Full': ['Yes', 'No', 'Yes'], 'Cat':['','','']})
cats = {'123':'A', '456':'B', '789':'C'}

for key, cat in cats.items():
    # 同时满足id匹配且Full为Yes的行,才修改Cat
    df.loc[(df['id'] == key) & (df['Full'] == 'Yes'), 'Cat'] = cat

print(df)

运行结果:

id Full Cat
0  123  Yes   A
1  456   No    
2  789  Yes   C

方法2:向量化操作(推荐)

利用pandas的向量化特性,无需循环,效率更高:

df = pd.DataFrame({'id': ['123', '456', '789'], 'Full': ['Yes', 'No', 'Yes'], 'Cat':['','','']})
cats = {'123':'A', '456':'B', '789':'C'}

# 仅对Full为Yes的行,将id映射为字典对应值并赋值给Cat
df.loc[df['Full'] == 'Yes', 'Cat'] = df.loc[df['Full'] == 'Yes', 'id'].map(cats)

print(df)

运行结果与方法1一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:31:08