You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:54:06