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
相关产品推荐
相关产品推荐

