如何基于公共列匹配用另一pandas DataFrame数值替换当前DataFrame的NaN值
解决方案
方法1:无需提前提取df3,直接全表匹配填充(推荐)
这种方法逻辑简单,不会出现索引错位问题,只会覆盖df1中的NaN值,不会修改原有有效值:
# 1. 将两个表的匹配公共列设为索引 df2_match = df2.set_index(['types', 'o_periods']) df1.set_index(['types', 'o_periods'], inplace=True) # 2. 用df2的数值填充df1的空值,overwrite=False表示不覆盖已有有效值 df1.update(df2_match, overwrite=False) # 3. 恢复df1的原有结构 df1.reset_index(inplace=True)
说明:update方法会自动基于索引匹配对应行,仅对df1中的NaN位置赋值,完全符合需求。
方法2:基于已提取的df3填充,解决索引丢失问题
如果你已经提前拆分出了df3,只需要在合并时保留df3的原始行索引即可:
# 1. 把df3的原始索引存为普通列,避免merge时丢失 df3 = df3.reset_index(names='origin_idx') # 2. 关联df2获取对应填充值,后缀区分旧的空值列和新的填充列 df3_filled = df3.merge( df2, on=['types', 'o_periods'], how='left', suffixes=('_drop', '') ) # 只保留需要的列 df3_filled = df3_filled[['origin_idx', 'types', 'c_years', 'o_periods', 's_months', 'incidents']] # 3. 把原始索引恢复为行索引,更新到df1对应位置 df3_filled = df3_filled.set_index('origin_idx') df1.update(df3_filled)
说明:之前遇到索引重置问题,是因为merge操作默认会生成新的连续整数索引,丢失了df3原本对应df1的行位置,提前存下原始索引再恢复即可解决。
内容的提问来源于stack exchange,提问作者Cedric
相关产品推荐
相关产品推荐

