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

如何对比两个DataFrame并删除新生成DataFrame中的重复项?

问题分析与解决方案

你的代码逻辑绕了弯路,核心问题在于:给两个DF分别添加master/daily索引后,合并的DF里即使内容完全重复的行,因为索引层级不同,drop_duplicates()会把它们当成不同行,自然没法正确去重。

直接瞄准核心需求:删除new_df中与旧df(master数据集)完全重复的行,用下面几种更直接的方法就行:


方法一:用merge找出重复项并过滤

通过merge找到两个DF的交集,再从new_df中剔除这些行:

# 找出new_df和df中完全重复的行
duplicate_rows = pd.merge(new_df, df, how='inner', on=list(new_df.columns))
# 从new_df中删除这些重复行
new_df_cleaned = new_df[~new_df.isin(duplicate_rows.to_dict('list')).all(axis=1)]

方法二:用isin结合所有列判断

直接检查new_df的每一行是否存在于df中:

# 将df转换为元组集合,方便快速查找
df_rows = set(df.apply(tuple, axis=1))
# 过滤new_df中不在df_rows里的行
new_df_cleaned = new_df[new_df.apply(tuple, axis=1).map(lambda x: x not in df_rows)]

方法三:用concat+duplicated标记重复

合并两个DF后标记重复,只保留new_df中不重复的部分:

# 给两个DF加来源标记,方便后续筛选
df['source'] = 'master'
new_df['source'] = 'daily'
# 合并
combined = pd.concat([df, new_df])
# 标记重复行(除了第一次出现的)
combined['is_duplicate'] = combined.duplicated(subset=list(combined.columns.drop('source')), keep='first')
# 筛选出new_df中不重复的行
new_df_cleaned = combined[(combined['source'] == 'daily') & (~combined['is_duplicate'])].drop(['source', 'is_duplicate'], axis=1)

原代码问题拆解

  1. 先对new_df执行drop_duplicates(keep=False)会删除new_df内部所有重复的行,这和你“对比旧DF去重”的需求无关,反而可能误删有用数据
  2. 给两个DF分别添加不同的索引层级后,合并后的行因为索引不同,drop_duplicates()无法识别内容重复的行,导致去重失效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 16:45:44