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

Pandas drop_duplicates/duplicated未识别全部重复项,求解决方案

Pandas去重不彻底的解决办法

问题根源在于不同数据源(CSV/Excel)读取后的数据类型不一致,或字符串列存在不可见空白字符,导致drop_duplicates无法识别重复项。以下是针对性的实操方案:

1. 统一日期时间格式

Excel读取的日期时间可能带毫秒精度,CSV读取的可能是字符串,合并后直接去重会因格式不匹配失败。建议合并日期和时间为完整datetime列:

# 合并日期时间并统一格式
df_a['Full_Datetime'] = pd.to_datetime(
    df_a['Sample Date'].astype(str) + ' ' + df_a['Sample Time'].astype(str),
    errors='coerce'
)

# 检查转换失败的行(处理异常数据)
print(df_a[df_a['Full_Datetime'].isna()])

# 用合并后的列替代原日期时间列去重
df_deduped = df_a.drop_duplicates(
    subset=["AC", "LTRL", "PS Code", "Full_Datetime", "UoM"],
    keep=False
)

2. 深度清理字符串列

仅用str.strip()可能无法去除全角空格、制表符等不可见字符,需批量处理:

# 定义字符串清理函数
def clean_string(col):
    if pd.notna(col):
        # 移除所有空白字符+转大写(整合UoM的大写要求)
        return ''.join(str(col).split()).upper()
    return col

# 对目标字符串列批量应用
target_cols = ["AC", "PS Code", "UoM", "LTRL"]
df_a[target_cols] = df_a[target_cols].apply(clean_string)

3. 提前验证重复项

在去重前定位差异,确认问题类型:

# 聚焦问题数据集
focus_df = df_a[(df_a['AC'] == '1930') & (df_a['PS Code'] == 'CA3310012_012_012')]

# 转换为字符串后检查重复(绕过类型差异)
str_converted = focus_df[["Sample Date", "Sample Time"]].astype(str)
print("转换为字符串后的重复行数:", str_converted.duplicated(keep=False).sum())

# 查看具体重复行
print(focus_df[str_converted.duplicated(keep=False)])

如果这里能识别出重复,说明是数据类型导致的去重失败。

4. 合并后统一所有数据类型

CSV和Excel读取的列类型常不一致,合并后强制标准化:

# 统一字符串列类型
df_a[target_cols] = df_a[target_cols].astype(str)

# 单独处理日期时间(不合并的情况)
df_a['Sample Date'] = pd.to_datetime(df_a['Sample Date']).dt.normalize()
df_a['Sample Time'] = pd.to_datetime(df_a['Sample Time']).dt.time

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 11:57:37