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

如何用Pandas合并两个DataFrame并保留最新重复行数据

合并DataFrame并保留新数据的重复值

问题场景

现有两个DataFrame:
mydata_old:

xy
110
215
312
421

mydata_new:

xy
420
525
630

需要合并后实现:重复的x值(如x=4)保留mydata_new中的值,不重复显示,最终结果如下:

xy
110
215
312
420
525
630

你尝试的pd.merge(mydata_new, mydata_old, how="left")无法得到预期结果,是因为左连接仅会保留mydata_new中的x值,丢失mydata_old里x=1、2、3的行。

解决方案

方法1:拼接后去重(最直观)

先将两个DataFrame纵向拼接,再按x去重,保留每个x最后出现的行(即mydata_new中的重复值):

import pandas as pd

# 构造示例数据
mydata_old = pd.DataFrame({'x': [1,2,3,4], 'y': [10,15,12,21]})
mydata_new = pd.DataFrame({'x': [4,5,6], 'y': [20,25,30]})

# 合并、去重、排序
mydata = pd.concat([mydata_old, mydata_new]) \
           .drop_duplicates(subset='x', keep='last') \
           .sort_values('x') \
           .reset_index(drop=True)

方法2:用combine_first实现值覆盖

将x设为索引,利用combine_first让新数据覆盖旧数据的重复值:

mydata = mydata_new.set_index('x') \
           .combine_first(mydata_old.set_index('x')) \
           .reset_index() \
           .sort_values('x')

方法3:基于merge的填充方案

如果一定要用merge,可以先做外连接,再用新数据的y值填充:

# 外连接得到包含新旧y值的结果
merged = pd.merge(mydata_old, mydata_new, on='x', how='outer', suffixes=('_old', '_new'))
# 优先用新数据的y值,无新数据则用旧数据
merged['y'] = merged['y_new'].fillna(merged['y_old'])
# 整理成目标格式
mydata = merged[['x', 'y']].sort_values('x').reset_index(drop=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:05:24