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

如何合并两个Pandas DataFrame,重复单元格保留首个DataFrame的值?

解决DataFrame合并后重复行问题

问题描述

我有两个DataFrame:df1和df2,希望合并两者的所有行与列,使得结果中parameter和date列的组合为唯一行,其余列也为唯一列。此前尝试使用concat合并后出现重复行(如parameter为A、date为2023-01-01的行出现两次),且期望重复单元格保留df1中的值。

之前使用的代码:

df1 = pd.DataFrame({ 'parameter' : ['A', 'B'], 'date' : ['2023-01-01', '2023-01-02'], 'column2' : ['A2_1', 'B2_2'], 'column3' : ['A3_1', 'B3_2'], 'column4' : ['A4_1', 'B4_2'], 'column5' : ['A5_1', 'B5_2'] })
df2 = pd.DataFrame({ 'parameter' : ['A', 'C'], 'date' : ['2023-01-01', '2023-01-03'], 'column4' : ['A4_1_1', 'C4_3'], 'column5' : ['A5_1_1', 'C5_3'], 'column6' : ['A6_2', 'C6_3'], 'column7' : ['A7_2', 'C7_3'] })
res = pd.concat([df1, df2]).sort_values(['parameter', 'date']).fillna('').reset_index(drop=True)
print(res)

解决方案

可以通过**复合索引+combine_first**的方式实现,无需循环和条件判断,且自动保留df1的优先级值:

方法一(简洁高效)

# 将两个DataFrame设置以parameter和date为复合索引
df1_indexed = df1.set_index(['parameter', 'date'])
df2_indexed = df2.set_index(['parameter', 'date'])

# 合并:重复索引的单元格保留df1的值,缺失部分用df2填充
res = df1_indexed.combine_first(df2_indexed).reset_index().fillna('')
print(res)

原理说明:

  • set_index(['parameter', 'date']):把两列设为复合索引,让行的唯一性判断基于这两列的组合
  • combine_first:优先保留df1中的非空值,仅用df2的数据填充df1中缺失的行、列或单元格
  • reset_index():将复合索引转回普通列,fillna('')把剩余空值替换为空字符串(和你之前的处理逻辑一致)

方法二(基于merge的实现)

如果更习惯用merge,也可以通过合并后处理重复列:

# 外连接合并,给df2的重复列加后缀
res = pd.merge(df1, df2, on=['parameter', 'date'], how='outer', suffixes=('', '_df2'))

# 遍历重复列,保留df1的值,删除df2的后缀列
for col in df1.columns:
    if col + '_df2' in res.columns:
        res[col] = res[col].combine_first(res[col + '_df2'])
        res.drop(col + '_df2', axis=1, inplace=True)

# 整理结果
res = res.fillna('').sort_values(['parameter', 'date']).reset_index(drop=True)
print(res)

两种方法都能实现需求,其中方法一代码更简洁,执行效率更高。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 13:50:21