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

Pandas追加相同DataFrame后drop_duplicates去重失败如何解决

问题根因

去重失效核心是两个原因:

  1. 去重键time的值类型不一致:从csv读取的旧数据中time是字符串类型,而新数据流df_new中的time可能是datetime类型,或者存在肉眼不可见的格式差异,pandas判定类型不同的值不属于重复值,导致drop_duplicates失效,这也是duplicated()全返回False的直接原因。
  2. 去重键逻辑不合理:仅用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 06:36:09