影刀RPA 数据去重策略多维度去重作者林焱什么情况用什么采集数据时有重复——同一个商品被采集了两次、同一条订单在合并时重复了、联系人有多个版本需要合并去重。简单的drop_duplicates()只能处理完全相同的行但实际场景中需要按部分列去重、保留最新记录、合并不同字段的信息。适用场景采集数据去重、多源数据合并去重、联系人信息合并、订单数据去重、日志去重。怎么做基础去重拼多多店群自动化上架方案importpandasaspd dfpd.read_excel(rC:\Data\raw_data.xlsx)# 1. 完全相同的行去重保留第一条df_uniquedf.drop_duplicates()# 2. 按指定列去重df_uniquedf.drop_duplicates(subset[订单ID])# 3. 保留最后一条如果有更新df_uniquedf.drop_duplicates(subset[订单ID],keeplast)# 4. 去重后保留所有重复行用于检查duplicatesdf[df.duplicated(subset[订单ID],keepFalse)]duplicates.to_excel(rC:\Data\duplicates_check.xlsx,indexFalse)按业务规则去重defdeduplicate_by_rule(df,key_col,sort_colNone,keeplast): 按业务规则去重 key_col: 去重依据列 sort_col: 排序列保留最新/最大的 keep: first或last ifsort_col:# 先按时间排序再去重保留最新dfdf.sort_values(sort_col,ascendingFalse)df_uniquedf.drop_duplicates(subsetkey_col,keepkeep)returndf_unique.reset_index(dropTrue)# 使用按订单ID去重保留更新时间最新的df_cleandeduplicate_by_rule(df,key_col订单ID,sort_col更新时间,keepfirst# 排序后第一条就是最新的)print(f去重前:{len(df)}行 → 去重后:{len(df_clean)}行)print(f删除:{len(df)-len(df_clean)}条重复)多字段去重# 按姓名手机号组合去重df_uniquedf.drop_duplicates(subset[姓名,手机号])# 按姓名手机号邮箱三字段组合去重df_uniquedf.drop_duplicates(subset[姓名,手机号,邮箱])# 模糊匹配去重手机号格式不一但同一个人defnormalize_for_dedup(df,columns):标准化字段用于去重forcolincolumns:ifcol手机号:df[f{col}_std]df[col].astype(str).str.replace(r[^0-9],,regexTrue)elifcol邮箱:df[f{col}_std]df[col].astype(str).str.lower().str.strip()elifcol姓名:df[f{col}_std]df[col].astype(str).str.strip().str.replace( ,)std_cols[f{col}_stdforcolincolumns]df_uniquedf.drop_duplicates(subsetstd_cols)df_uniquedf_unique.drop(columnsstd_cols)returndf_unique# 使用df_cleannormalize_for_dedup(df,[姓名,手机号,邮箱])合并去重保留不同字段的信息defmerge_duplicates(df,key_col,merge_colsNone): 合并重复记录的不同字段信息 如记录A有手机号无邮箱记录B有邮箱无手机号合并后两者都有 ifmerge_colsisNone:merge_cols[cforcindf.columnsifc!key_col]merged_rows[]forkey_val,groupindf.groupby(key_col):iflen(group)1:merged_rows.append(group.iloc[0])else:# 合并多条记录merged{key_col:key_val}forcolinmerge_cols:# 取第一个非空值non_nullgroup[col].dropna()non_nullnon_null[non_null!]merged[col]non_null.iloc[0]iflen(non_null)0elseNonemerged_rows.append(merged)returnpd.DataFrame(merged_rows)# 使用df_mergedmerge_duplicates(df,key_col客户ID,merge_cols[姓名,手机号,邮箱,地址])去重报告defgenerate_dedup_report(df,key_col,output_path):生成去重报告totallen(df)uniquedf[key_col].nunique()duplicatestotal-unique report[]report.append(数据去重报告)report.append(*50)report.append(f\n总记录数:{total})report.append(f唯一{key_col}数:{unique})report.append(f重复记录数:{duplicates})report.append(f重复率:{duplicates/total*100:.2f}%)# 列出重复的记录dup_recordsdf[df.duplicated(subsetkey_col,keepFalse)]iflen(dup_records)0:report.append(f\n重复记录明细共{len(dup_records)}条:)dup_countsdup_records.groupby(key_col).size().sort_values(ascendingFalse)report.append(f 重复次数最多的前10个{key_col}:)forkey,countindup_counts.head(10).items():report.append(f{key}: 重复{count}次)withopen(output_path.replace(.xlsx,_report.txt),w,encodingutf-8)asf:f.write(\n.join(report))returnreport# 使用generate_dedup_report(df,订单ID,rC:\Data\dedup_result.xlsx)影刀RPA去重流程【读取Excel文件】→ 原始数据 【执行Python代码】→ 检查重复 打印重复数量和重复率 【执行Python代码】→ 去重 按订单ID去重保留更新时间最新的  【执行Python代码】→ 生成去重报告 【写入Excel文件】→ 去重后数据 重复记录明细有什么坑坑1drop_duplicates修改了原数据TEMU店群如何管理运营# 问题drop_duplicates默认返回新DataFrame不改原数据df.drop_duplicates()# df没有变化# 正确dfdf.drop_duplicates()# 或df.drop_duplicates(inplaceTrue)坑2去重后索引不连续# 问题去重后索引跳号dfdf.drop_duplicates()print(df.index)# 0, 1, 3, 5, 7... 跳号# 解决重置索引dfdf.drop_duplicates().reset_index(dropTrue)坑3keepFalse和keepfirst’混淆# keepfirst默认保留第一条删除后续重复df.drop_duplicates(subset[ID])# 保留第一条# keeplast保留最后一条df.drop_duplicates(subset[ID],keeplast)# keepFalse删除所有重复行包括第一条# 用于找出所有有重复的记录duplicatesdf[df.duplicated(subset[ID],keepFalse)]# 这个不是drop_duplicates是duplicated坑4大小写不同的重复# 问题Apple和apple被认为是不同的df.drop_duplicates(subset[产品名])# 不会去掉大小写不同的重复# 解决先标准化再去重df[产品名_std]df[产品名].str.lower().str.strip()dfdf.drop_duplicates(subset[产品名_std])dfdf.drop(columns[产品名_std])坑5多列去重时某列有空值# 问题空值和空值不算重复# 两行都是(张三, NaN)drop_duplicates认为不重复df.drop_duplicates(subset[姓名,邮箱])# 两行(张三, NaN)都保留了# 解决空值填充统一值df[邮箱]df[邮箱].fillna(无邮箱)dfdf.drop_duplicates(subset[姓名,邮箱])