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
相关产品推荐
相关产品推荐

