Pandas:如何合并不同形状DataFrame并填充NaN值?
解决Pandas不同形状DataFrame的NaN填充问题
你的需求是基于No和pl.两个键,用df2中的Expected值填充df1对应位置的NaN,之前的代码没生效是因为fillna要求填充的数据源和原DataFrame形状完全匹配(行列数一致),而merge后的结果和df1结构不同,所以无法正确映射填充。下面给你两种简单可行的方案:
方案一:左连接 + combine_first
这种方法先通过左连接把df2的匹配值带到df1中,再用combine_first合并列,保留原df1的非NaN值,替换匹配到的NaN:
# 复制原df1避免修改原始数据 df_final = df1.copy() # 左连接df2,将匹配到的Expected值作为新列 merged = df_final.merge(df2, on=['No', 'pl.'], how='left', suffixes=('', '_from_df2')) # 合并Expected列:保留原有的非NaN值,用df2的值填充NaN df_final['Expected'] = merged['Expected'].combine_first(merged['Expected_from_df2']) # 删掉临时列 df_final = df_final.drop(columns='Expected_from_df2')
方案二:索引映射 + combine_first
这种方法更简洁,通过设置复合索引直接匹配对应值:
df_final = df1.copy() # 将df2设置为以No和pl.为索引的Series,直接匹配填充df1的NaN df_final['Expected'] = df_final['Expected'].combine_first( df2.set_index(['No', 'pl.'])['Expected'] )
这两种方法都会得到你想要的最终DataFrame,其中方案二更简洁高效,适合这种按多键匹配填充的场景。
内容的提问来源于stack exchange,提问作者Cave
相关产品推荐
相关产品推荐

