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

