如何用Join填充Pandas DataFrame中匹配的NA值
解决用DataFrame填充另一DataFrame NA值的问题
你遇到的重复列问题,是因为merge时两个表都有C列,而on只指定了A、B,所以合并后会自动给重复列加_x(来自data1)和_y(来自data2)后缀,且这个操作不会自动完成NA填充。下面是几种可行的解决方案:
方法1:用combine_first(最简洁)
这个方法专门用来用一个DataFrame填充另一个的NA值,只需先让两个表按匹配键对齐:
import pandas as pd data1 = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, None]], columns=['A', 'B', 'C']) data2 = pd.DataFrame([[7, 8, 9]], columns=['A','B','C']) # 将A、B设为索引确保匹配对齐 data1_idx = data1.set_index(['A', 'B']) data2_idx = data2.set_index(['A', 'B']) # 填充NA后恢复原索引 filled_data = data1_idx.combine_first(data2_idx).reset_index() print(filled_data)
输出结果:
A B C 0 1 2 3.0 1 4 5 6.0 2 7 8 9.0
方法2:merge后手动填充
如果要保留merge的思路,可以合并后手动处理重复列:
import pandas as pd data1 = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, None]], columns=['A', 'B', 'C']) data2 = pd.DataFrame([[7, 8, 9]], columns=['A','B','C']) # 执行左连接 merged = data1.merge(data2, on=['A','B'], how='left') # 用data2的C值填充data1的NA,清理冗余列 merged['C'] = merged['C_x'].fillna(merged['C_y']) filled_data = merged.drop(['C_x', 'C_y'], axis=1) print(filled_data)
方法3:用update原地更新
update会直接用匹配到的值覆盖原表的NA,注意它是原地修改操作:
import pandas as pd data1 = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, None]], columns=['A', 'B', 'C']) data2 = pd.DataFrame([[7, 8, 9]], columns=['A','B','C']) # 设置索引对齐 data1.set_index(['A', 'B'], inplace=True) data2.set_index(['A', 'B'], inplace=True) # 用data2更新data1的NA值 data1.update(data2) filled_data = data1.reset_index() print(filled_data)
内容的提问来源于stack exchange,提问作者Varsha Ramamurthy
相关产品推荐
相关产品推荐

