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

Python合并同/异列名DataFrame 用第二表值覆盖同ID行数据

实现方案

核心逻辑是按ID做全外连接保留所有字段和行,匹配到的ID优先取DataFrame2的同名字段值,缺失字段自动填充空值,用pandas内置的combine_first可以一步完成,不需要额外写字段判断逻辑。

步骤1:构造测试数据

先复现你提到的两个DataFrame:

import pandas as pd

# 第一个DataFrame
df1 = pd.DataFrame({
    'ID': ['row1', 'row2'],
    'A': [1, 4],
    'B': [2, 5],
    'C': [3, 6]
})

# 第二个DataFrame
df2 = pd.DataFrame({
    'ID': ['row1'],
    'A': [6],
    'B': [7],
    'D': [8]
})

步骤2:执行合并

将ID设为行索引后调用combine_first,该方法会优先保留调用方(即df2)的非空值,缺失值位置取被传入的df1的对应值,自动对齐所有字段:

result = df2.set_index('ID').combine_first(df1.set_index('ID')).reset_index()

结果验证

打印result可以得到完全符合预期的输出:

ID  A  B    C    D
0  row1  6  7  3.0  8.0
1  row2  4  5  6.0  NaN

注:C、D列出现浮点数是因为pandas中空值NaN默认是float类型,如果需要保持整数类型,可以在合并后调用.astype({'C':'Int64', 'D':'Int64'})做类型转换,支持带空值的整数格式。

为什么直接用merge/concat不符合预期

  • 直接用merge做外连接时,A、B等同名字段会自动加后缀生成A_x/A_y、B_x/B_y两列,需要手动逐列写判断逻辑取df2的值覆盖,代码冗余易出错。
  • 直接用concat做行拼接时,会生成两条ID为row1的记录,不会自动做值覆盖,后续还需要额外去重处理,逻辑繁琐。

内容的提问来源于stack exchange,提问作者woops

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:18:15