Pandas的update方法执行无效果,替换DataFrame匹配行不生效如何解决?
pandas update方法执行无效果问题排查与修复
问题场景
现有两个列结构、索引规则完全相同的DataFrame:体量较大的df1和体量较小的df2,初始构造代码如下:
df1 = pd.read_csv(milkProdFile, delimiter=';', dtype=str, names=cols).set_index(["ANIM", "NULACT"], drop=False) df2 = pd.read_csv(correctionFile, delimiter=';', dtype=str, names=cols).set_index(["ANIM", "NULACT"], drop=False)
期望通过pandas的update方法,用df2中索引匹配的行替换df1的对应行,执行代码如下:
df1.update(df2) df1.to_csv("./corrected_lacts.txt", sep=';', header=False, index=False)
执行后无预期效果,输出的corrected_lacts.txt仍保留milkProdFile的原始值。
问题原因
问题根源出在set_index的执行时机和参数设置:
- 调用
set_index时指定了drop=False,导致ANIM、NULACT两个字段同时作为索引和普通列存在 update方法的逻辑是先按索引匹配行,再按列名匹配列覆盖,重名列会导致非索引列的对齐、覆盖逻辑不符合预期,最终出现修改不生效的问题
修复方案
经过验证可行的方案有两种,你可以按需选择:
方案1:调整set_index到输出环节(和你验证有效的操作逻辑一致)
# 读入数据时不提前设置索引 df1 = pd.read_csv(milkProdFile, delimiter=';', dtype=str, names=cols) df2 = pd.read_csv(correctionFile, delimiter=';', dtype=str, names=cols) # 临时设置索引用于update匹配 df1 = df1.set_index(["ANIM", "NULACT"], drop=False) df2 = df2.set_index(["ANIM", "NULACT"], drop=False) df1.update(df2) # 重置索引后输出,如果最终需要保留索引可在输出前再执行set_index df1 = df1.reset_index(drop=True) df1.to_csv("./corrected_lacts.txt", sep=';', header=False, index=False)
方案2:set_index时移除重复的普通列
# 设置索引时直接移除作为普通列的索引字段,避免重名 df1 = pd.read_csv(milkProdFile, delimiter=';', dtype=str, names=cols).set_index(["ANIM", "NULACT"], drop=True) df2 = pd.read_csv(correctionFile, delimiter=';', dtype=str, names=cols).set_index(["ANIM", "NULACT"], drop=True) df1.update(df2) # 输出前把索引恢复为普通列即可 df1.reset_index(drop=False).to_csv("./corrected_lacts.txt", sep=';', header=False, index=False)
内容的提问来源于stack exchange,提问作者Zulu
相关产品推荐
相关产品推荐

