如何对比两个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)
原代码问题拆解
- 先对new_df执行
drop_duplicates(keep=False)会删除new_df内部所有重复的行,这和你“对比旧DF去重”的需求无关,反而可能误删有用数据 - 给两个DF分别添加不同的索引层级后,合并后的行因为索引不同,
drop_duplicates()无法识别内容重复的行,导致去重失效
内容的提问来源于stack exchange,提问作者glitch_123
相关产品推荐
相关产品推荐

