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

Pandas:比较含重复值的两个DataFrame并保留单个重复项

解决DataFrame合并时保留重复项中一行的问题

嘿,我完全get到你的需求了——你手里有两个DataFrame,其中df1的C列存在重复值(比如两行都是51),你希望合并操作中这两行要么同时出现在结果里(但最终只保留其中一个重复项),要么同时被移除,绝对不想出现一行留着、一行被删掉的尴尬情况对吧?下面给你两种实用的解决办法:

方法一:先去重df1,再合并

这是最直接的思路:先把df1里C列的重复值清理掉,只保留每个C值的一行(比如保留第一次出现的那行),再和df2合并。这样一来,合并后的结果里自然不会有重复的C值,而且能保证原来的重复行要么都被提前过滤掉,要么只会以一行的形式出现在最终结果里。

代码示例:

import pandas as pd

# 模拟你的df1和df2
df1 = pd.DataFrame({'A': [1, 2, 3], 'C': [50, 51, 51]})
df2 = pd.DataFrame({'B': [10, 20], 'C': [50, 51]})

# 对df1按C列去重,保留首次出现的行
df1_deduped = df1.drop_duplicates(subset='C', keep='first')

# 合并去重后的df1与df2
merged_final = pd.merge(df1_deduped, df2, on='C', how='inner')
print(merged_final)

输出结果:

A   C   B
0  1  50  10
1  2  51  20

可以看到,df1中原来的两个51行,去重后只留了第一行,合并后也只有一行51的记录,完全符合你的要求。

方法二:先合并,再统一处理重复项

如果你需要先保留df1的所有行完成合并(比如要用到其他列的额外信息),之后再处理重复项,那可以先执行合并操作,再根据C列去重。这样能保证:如果df1的两个重复行都能和df2匹配上,合并后会暂时出现两行重复的C值,我们再去重留一行;如果都匹配不上,合并时就会被一起过滤掉。

代码示例:

# 先合并df1和df2
merged_df = pd.merge(df1, df2, on='C', how='inner')

# 按C列去重,保留任意一行(这里选最后一行的话,把keep改成'last'即可)
final_df = merged_df.drop_duplicates(subset='C', keep='first')
print(final_df)

这个方法的输出结果和方法一完全一致,灵活性更高,适合需要保留合并过程中所有临时数据的场景。

小提示:如果你想保留重复行里的最后一行,只需要把keep='first'改成keep='last';要是想彻底删除所有重复的C值(包括第一次出现的),就用keep=False,不过这应该不是你想要的效果~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:03:21