使用pd.update时Pandas抛出“Data overlaps.”错误的原因及解决方法
嘿,我来帮你理清这个问题的原因,再给你几个优雅的解决办法。
你遇到的ValueError: Data overlaps,是因为在pandas 0.25.0版本中,当使用update方法并设置overwrite=False时,如果主DataFrame(df_main)和更新用的DataFrame(df_update)存在非NaN值的重叠行,哪怕两个值完全相同,也会触发这个错误。
看你的数据:df_main里GroupID=1和GroupID=2的所有行的StartDate都是非NaN值,而df_update里对应的这些行也有相同的StartDate值。overwrite=False的逻辑是“只更新主DataFrame中的NaN值,绝不修改已有非NaN值”,但pandas会把这种“更新数据里存在主DataFrame已有非NaN值的行”判定为数据重叠,从而抛出错误。
针对你的需求——用df_update的非NaN值填充df_main的NaN值,同时保留df_main已有非NaN值,有两种简洁的方法:
方法1:先筛选更新数据再执行update
先从df_update中只提取那些在df_main里StartDate为NaN的行,再用这些过滤后的行去更新,这样就不会有重叠的非NaN数据了:
# 找出df_main中StartDate为NaN的索引 nan_rows_idx = df_main[df_main['StartDate'].isna()].index # 从df_update中筛选出需要更新的行 filtered_update = df_update.loc[nan_rows_idx] # 执行更新 df_main.update(filtered_update, overwrite=False)
方法2:使用combine_first(更推荐)
pandas的combine_first方法天生就是为这种场景设计的:它会自动对齐两个DataFrame的索引,用传入的DataFrame(df_update)的非NaN值填充当前DataFrame(df_main)的NaN值,而且完全不会覆盖已有非NaN值,代码更简洁:
df_main = df_main.combine_first(df_update)
这个方法不需要手动筛选,直接一步到位,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者Hadron Tungsten

