如何用Pandas合并两个DataFrame并保留最新重复行数据
合并DataFrame并保留新数据的重复值
问题场景
现有两个DataFrame:mydata_old:
| x | y |
|---|---|
| 1 | 10 |
| 2 | 15 |
| 3 | 12 |
| 4 | 21 |
mydata_new:
| x | y |
|---|---|
| 4 | 20 |
| 5 | 25 |
| 6 | 30 |
需要合并后实现:重复的x值(如x=4)保留mydata_new中的值,不重复显示,最终结果如下:
| x | y |
|---|---|
| 1 | 10 |
| 2 | 15 |
| 3 | 12 |
| 4 | 20 |
| 5 | 25 |
| 6 | 30 |
你尝试的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
相关产品推荐
相关产品推荐

