Pandas数据清洗实战:用duplicated()函数揪出重复数据,附完整代码示例
Pandas数据清洗实战用duplicated()函数揪出重复数据附完整代码示例数据清洗是数据分析过程中最耗时但至关重要的环节。根据IBM的研究数据科学家平均花费80%的时间在数据清洗和准备上。而在各类数据质量问题中重复数据是最常见也最容易被忽视的问题之一。想象一下你正在分析电商平台的用户行为数据如果同一个用户的多次购买被错误地记录为多个不同用户你的转化率分析、用户画像构建都将产生严重偏差。1. 重复数据的危害与识别策略重复数据就像隐藏在数据集中的噪音它们悄无声息地扭曲分析结果。在金融领域重复的交易记录可能导致错误的盈亏计算在医疗数据中重复的患者记录会造成诊断失误在用户行为分析中重复的点击数据会虚增用户参与度。1.1 重复数据的典型表现完全相同的记录所有字段值都相同关键字段重复如用户ID、订单号等唯一标识符重复部分字段重复如姓名手机号组合重复近似重复如地址北京市海淀区和北京海淀区# 创建包含多种重复类型的示例数据 import pandas as pd data { user_id: [101, 102, 101, 104, 105, 102, 107], name: [张三, 李四, 张三, 王五, 赵六, 李四, 钱七], phone: [13800138000, 13900139000, 13800138000, 13700137000, 13600136000, 13900139000, 13500135000], address: [北京市海淀区, 上海市浦东新区, 北京海淀区, 广州市天河区, 深圳市南山区, 上海浦东新区, 成都市武侯区], order_amount: [150.0, 200.0, 150.0, 300.0, 250.0, 200.0, 180.0] } df pd.DataFrame(data)1.2 duplicated()函数的核心参数解析duplicated()函数是Pandas中识别重复数据的瑞士军刀它的灵活性来自几个关键参数参数说明常用取值subset指定检查重复的列列名列表如[user_id, phone]keep标记重复项的策略first(默认), last, Falseinplace是否原地修改True/False提示设置keepFalse会标记所有重复项(包括第一个出现的)这在需要完全识别所有重复实例时非常有用。2. 实战从基础到高级的重复数据处理让我们通过一个电商订单数据的完整案例演示如何处理现实世界中的重复数据问题。2.1 数据准备与初步检查首先加载并快速浏览我们的数据集# 加载电商订单数据 orders pd.read_csv(ecommerce_orders.csv) # 查看数据概览 print(f数据集形状: {orders.shape}) print(\n前5行数据:) display(orders.head()) # 检查重复订单ID duplicate_order_ids orders[orders.duplicated(subset[order_id], keepFalse)] print(f\n重复订单ID数量: {len(duplicate_order_ids)})2.2 多层次重复检测技术场景1检测完全相同的记录full_duplicates orders[orders.duplicated(keepFalse)] print(f完全相同的记录数: {len(full_duplicates)})场景2检测关键字段组合重复# 假设我们认为user_id order_time组合应该唯一 key_duplicates orders[orders.duplicated( subset[user_id, order_time], keepFalse )].sort_values([user_id, order_time])场景3高级模糊匹配检测# 对地址字段进行标准化处理 orders[clean_address] orders[address].str.replace(市, ).str.replace(区, ) # 检测标准化后的地址重复 address_duplicates orders[orders.duplicated( subset[user_id, clean_address], keepFalse )]2.3 可视化重复数据分布了解重复数据的分布特征能帮助我们制定更合理的处理策略import matplotlib.pyplot as plt # 按用户统计重复订单数 user_dup_counts orders.groupby(user_id).size() - orders.drop_duplicates( subset[user_id, product_id] ).groupby(user_id).size() plt.figure(figsize(10, 6)) user_dup_counts[user_dup_counts 0].plot(kindbar) plt.title(各用户重复订单数量分布) plt.xlabel(User ID) plt.ylabel(重复订单数) plt.show()3. 重复数据处理策略与最佳实践发现重复数据只是第一步如何正确处理它们才是真正的挑战。以下是几种常见场景的处理方案。3.1 删除重复项的多种方法方法1保留第一条记录cleaned_orders orders.drop_duplicates( subset[user_id, product_id, order_date], keepfirst )方法2保留最后一条记录适用于时间序列数据cleaned_orders orders.drop_duplicates( subset[user_id, product_id], keeplast, inplaceFalse )方法3删除所有重复项仅保留唯一记录unique_orders orders.drop_duplicates( subset[user_id, product_id], keepFalse )3.2 高级处理聚合而非简单删除对于某些场景聚合重复数据比简单删除更有意义# 对重复订单金额求和 aggregated_orders orders.groupby( [user_id, product_id, order_date] ).agg({ quantity: sum, amount: sum, payment_method: lambda x: x.mode()[0] }).reset_index()3.3 处理重复数据的黄金法则先分析后处理了解重复数据的性质和分布保留原始数据永远先备份再处理记录处理过程保存数据清洗的日志验证处理结果清洗后再次检查数据质量注意在金融或医疗等敏感领域删除数据前必须获得授权并遵循相关法规。4. 企业级数据清洗流程设计在实际业务场景中我们需要建立可重复、可审计的数据清洗流程。4.1 自动化数据质量检查创建可重用的数据质量检查函数def check_data_quality(df): 执行全面的数据质量检查 results { total_rows: len(df), full_duplicates: len(df[df.duplicated(keepFalse)]), key_duplicates: len(df[df.duplicated(subset[user_id, order_id], keepFalse)]), null_values: df.isnull().sum().to_dict() } return pd.DataFrame.from_dict(results, orientindex, columns[count])4.2 构建数据清洗流水线from sklearn.pipeline import Pipeline from sklearn.base import BaseEstimator, TransformerMixin class DuplicateHandler(BaseEstimator, TransformerMixin): def __init__(self, subsetNone, keepfirst): self.subset subset self.keep keep def fit(self, X, yNone): return self def transform(self, X): return X.drop_duplicates(subsetself.subset, keepself.keep) # 创建处理流水线 clean_pipeline Pipeline([ (duplicate_cleaner, DuplicateHandler( subset[user_id, order_date, product_id], keeplast )), # 可以添加其他清洗步骤 ]) cleaned_data clean_pipeline.fit_transform(orders)4.3 数据清洗监控与报告定期生成数据质量报告监控重复数据趋势def generate_quality_report(df, date_colorder_date): 生成每日数据质量报告 report df.groupby(df[date_col].dt.date).apply( lambda x: pd.Series({ total_orders: len(x), duplicate_rate: x.duplicated( subset[user_id, product_id] ).mean(), unique_users: x[user_id].nunique() }) ) return report在实际项目中我发现最棘手的不是技术问题而是业务规则的理解。曾经因为对重复订单的业务定义理解偏差导致一次促销活动分析完全错误。现在我会坚持三点1)与业务方确认重复定义 2)清洗前保存数据快照 3)记录每个清洗步骤的影响。