Pandas合并两个DataFrame:用第二个表数据补全第一个表匹配行
Pandas实现匹配行覆盖补全的方法
以下是三种可行的实现方案:
方案1:使用combine_first(最简洁)
优先使用df5的匹配行数据,缺失的内容用df4填充,一行代码即可完成:
import pandas as pd # 你的测试数据 df4 = pd.DataFrame({'a':['red','green','yellow','blue'],'b':[1,5,6,7],'c':[1,7,8,9]}) df5 = pd.DataFrame({'a':'red','b':44, 'c':55}, index=[0]) # 核心代码 res = df5.set_index('a').combine_first(df4.set_index('a')).reset_index()
输出结果完全符合你的预期,列顺序和值都正确。
方案2:使用update方法(原地修改)
如果可以接受修改原df4,用update方法更高效:
# 先将公共匹配列设为索引 df4_idx = df4.set_index('a') df5_idx = df5.set_index('a') # 用df5的值覆盖df4的匹配行 df4_idx.update(df5_idx) # 重置索引恢复结构 res = df4_idx.reset_index()
如果不想修改原df4,可以先对df4做拷贝再操作:df4_idx = df4.set_index('a').copy()。
方案3:基于merge结果合并列
如果你已经执行了merge操作,也可以直接对生成的_x、_y列做合并:
merged = pd.merge(df4, df5, how='left', on='a') # 优先用y列的值,空值用x列填充,可根据需要转换数据类型 merged['b'] = merged['b_y'].fillna(merged['b_x']).astype(int) merged['c'] = merged['c_y'].fillna(merged['c_x']).astype(int) # 提取需要的列得到结果 res = merged[['a', 'b', 'c']]
注意事项
- 如果df5中存在同一个
a值对应多条数据的情况,需要先对df5按a列去重,确保每个匹配键唯一,否则会出现覆盖异常。 - merge后产生的NaN会自动把int列转为float类型,如果需要保持整数类型,可以调用
astype(int)做转换。
内容的提问来源于stack exchange,提问作者luka
相关产品推荐
相关产品推荐

