Pandas追加相同DataFrame后drop_duplicates去重失败如何解决
问题根因
去重失效核心是两个原因:
- 去重键
time的值类型不一致:从csv读取的旧数据中time是字符串类型,而新数据流df_new中的time可能是datetime类型,或者存在肉眼不可见的格式差异,pandas判定类型不同的值不属于重复值,导致drop_duplicates失效,这也是duplicated()全返回False的直接原因。 - 去重键逻辑不合理:仅用
time作为唯一键会出现跨日期同时间数据被误去重的问题,应该用date+time作为联合唯一键。
你之前用索引去重的方案完全不符合需求:两个DataFrame append后索引本身就是重复的0-3,去索引重复自然会出现丢数据、乱序的问题。
修复方案
步骤1:统一时间字段格式,生成唯一去重键
读写数据时统一把date和time的格式、类型对齐,确保新旧数据的去重键完全一致。
步骤2:使用联合键去重,替换已废弃的append方法
pandas 2.0+已经废弃append方法,推荐用pd.concat做数据合并,同时指定联合去重键和保留规则。
修正后代码
import os import pandas as pd # 处理新数据:统一date、time为字符串类型 df_new['date'] = df_new['date'].astype(str) df_new['time'] = df_new['time'].astype(str) if os.path.isfile(filename): df_old = pd.read_csv(filename, encoding='UTF-8') # 旧数据也同步对齐类型 df_old['date'] = df_old['date'].astype(str) df_old['time'] = df_old['time'].astype(str) else: df_old = pd.DataFrame() # 合并数据,用date+time做联合去重,keep='last'默认保留最新的那条数据 df_stream = pd.concat([df_old, df_new], ignore_index=True)\ .drop_duplicates(subset=['date', 'time'], keep='last') # 写入时不保留索引 df_stream.to_csv(filename, encoding='UTF-8', index=False)
如果担心字段格式仍有隐藏差异,可以加一个辅助的联合键列,用完删除即可:
# 生成统一格式的唯一去重键 df_new['unique_key'] = (df_new['date'] + ' ' + df_new['time']).astype(str) df_old['unique_key'] = (df_old['date'] + ' ' + df_old['time']).astype(str) df_stream = pd.concat([df_old, df_new], ignore_index=True)\ .drop_duplicates(subset=['unique_key'], keep='last')\ .drop(columns=['unique_key'])
内容的提问来源于stack exchange,提问作者Fahmi Fachrizal
相关产品推荐
相关产品推荐

