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
相关产品推荐
相关产品推荐

