news 2026/4/25 12:38:47

从一份混乱的销售数据说起:手把手教你用Pandas的duplicated函数搞定数据清洗

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从一份混乱的销售数据说起:手把手教你用Pandas的duplicated函数搞定数据清洗

从销售数据混乱到精准分析:Pandas duplicated函数实战指南

1. 数据清洗:商业决策的第一道防线

上个月市场部小王交给我一份Excel报表,里面记录了近三个月的客户购买记录。当我试图用这份数据做复购率分析时,发现同一个客户ID竟然在不同日期出现了多次交易记录,但产品名称和金额却完全一致。更糟的是,部分客户的基本信息(如联系电话)在不同记录中存在差异。这种数据混乱在业务场景中极为常见——可能是系统同步延迟、人工录入错误或接口重复调用导致的。

数据清洗如同烹饪前的食材处理,直接决定最终分析结果的可靠性。根据Gartner调研,数据科学家平均花费60%的工作时间在数据清洗和准备上。而重复数据识别(deduplication)正是其中最基础也最关键的环节。

常见重复数据场景

  • 系统自动重试导致的重复提交(如订单支付)
  • 多平台数据合并时的ID冲突
  • 人工录入时的误操作(如多次点击保存)
  • 时间维度数据采集的频率过高
import pandas as pd # 模拟销售数据 sales_data = { 'order_id': ['A1001', 'A1002', 'A1003', 'A1001', 'A1004'], 'client_id': ['C001', 'C002', 'C003', 'C001', 'C004'], 'product': ['笔记本', '显示器', '键盘', '笔记本', '鼠标'], 'amount': [4999, 1299, 199, 4999, 299], 'order_date': ['2023-05-01', '2023-05-02', '2023-05-02', '2023-05-01', '2023-05-03'] } df = pd.DataFrame(sales_data)

2. 精准识别:duplicated函数的深度应用

2.1 基础检测:发现完全重复行

最简单的应用场景是检测所有列值完全相同的记录。这在处理系统日志或传感器数据时尤为实用:

# 标记所有列完全相同的重复行 duplicate_mask = df.duplicated() print(df[duplicate_mask])

注意:默认情况下,duplicated()对首次出现的行返回False,后续重复行返回True

2.2 业务导向的列组合检测

实际业务中,我们往往需要根据业务规则定义"重复"。例如在销售数据中:

  • 相同order_id必定是重复记录
  • 相同client_id+product+amount可能是重复(需人工确认)
  • 相同client_id不同产品则是正常购买
# 多列组合检测 subset_duplicates = df.duplicated(subset=['client_id', 'product', 'amount'], keep=False) potential_duplicates = df[subset_duplicates].sort_values('client_id')

重复策略决策矩阵

重复类型处理方式业务逻辑
相同订单ID直接删除系统错误导致重复
相同客户+产品+金额人工核查可能为重复下单
相同客户不同产品保留正常购买行为

2.3 时间维度的高级处理

当数据包含时间戳时,我们通常需要保留最新记录:

# 转换日期格式并排序 df['order_date'] = pd.to_datetime(df['order_date']) df.sort_values('order_date', ascending=False, inplace=True) # 保留每个客户ID的最新记录 deduplicated = df.drop_duplicates(subset=['client_id'], keep='first')

3. 实战进阶:复杂业务场景解决方案

3.1 分级处理电商平台数据

某跨境电商平台的数据特征:

  • 订单表(orders):可能因支付系统重试产生重复
  • 用户表(users):多来源合并导致重复注册
  • 商品表(products):不同卖家上传相同商品

分级清洗方案

  1. 订单表处理:
# 保留支付成功的最后一条记录 clean_orders = orders.sort_values(['order_id', 'pay_status', 'create_time'], ascending=[True, False, False]) \ .drop_duplicates('order_id')
  1. 用户表处理:
# 合并相同邮箱但不同来源的用户 user_merge_rules = { 'name': 'last', # 保留最后录入的姓名 'phone': 'first', # 优先保留最早登记的电话 'reg_date': 'min' # 取最早注册日期 } clean_users = users.groupby('email').agg(user_merge_rules).reset_index()

3.2 金融交易数据特殊处理

证券交易记录需要特别处理:

  • 相同客户+股票代码+价格+数量+时间:真实重复交易
  • 相同客户+股票代码+不同价格:正常交易
# 标记疑似异常交易 trade_dupe_cols = ['client_id', 'stock_code', 'price', 'quantity', 'trade_time'] df['is_duplicate'] = df.duplicated(subset=trade_dupe_cols, keep=False) # 生成待审核记录 review_list = df[df['is_duplicate']].sort_values(['client_id', 'trade_time'])

4. 性能优化与大数据量处理

当处理千万级数据时,需要特别考虑性能:

优化技巧对比表

方法适用场景优点缺点
直接drop_duplicates小数据集(<1GB)代码简单内存消耗大
分块处理中等数据(1-10GB)控制内存使用需要额外合并步骤
Dask库超大数据(>10GB)分布式计算学习成本较高

分块处理示例

chunk_size = 100000 clean_chunks = [] for chunk in pd.read_csv('huge_file.csv', chunksize=chunk_size): clean_chunk = chunk.drop_duplicates(subset=['key_column']) clean_chunks.append(clean_chunk) final_clean = pd.concat(clean_chunks).drop_duplicates(subset=['key_column'])

内存优化技巧

  • 处理前用df.info()查看内存占用
  • 对分类变量使用category类型
df['product_type'] = df['product_type'].astype('category')
  • 只加载必要列:
cols = ['order_id', 'client_id', 'order_date'] df = pd.read_csv('sales.csv', usecols=cols)

5. 质量验证与自动化流程

清洗后的数据验证至关重要:

验证检查清单

  1. 重复率变化:len(raw_df) - len(clean_df)
  2. 关键字段唯一性:clean_df['order_id'].is_unique
  3. 时间范围一致性:
assert clean_df['order_date'].min() >= pd.to_datetime('2023-01-01')
  1. 金额分布合理性:
assert clean_df['amount'].between(1, 100000).all()

自动化清洗流水线示例

def auto_clean(df): # 步骤1:基础清洗 df = df.convert_dtypes() df = df.drop_duplicates(subset=['id']) # 步骤2:业务规则清洗 df = business_rules_clean(df) # 步骤3:输出质量报告 generate_quality_report(df) return df # 添加定时任务 from apscheduler.schedulers.blocking import BlockingScheduler sched = BlockingScheduler() @sched.scheduled_job('cron', hour=2) def daily_clean(): raw_df = pd.read_csv('/data/sales_daily.csv') clean_df = auto_clean(raw_df) clean_df.to_parquet('/data/clean/sales_clean.parquet') sched.start()

数据清洗从来不是一次性工作。我在金融行业实施的一个项目中,初期数据清洗方案运行良好,直到某天支付系统升级导致重复交易激增。这时我们不得不调整阈值参数,并增加特殊规则处理周末数据。好的数据清洗方案应该像软件一样持续迭代,定期review业务规则,与一线业务人员保持沟通,才能确保数据质量始终满足分析需求。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 12:35:52

DATABASE练习题操作及解析

将数据表建好写好如下&#xff1a;题目&#xff1a;1.查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数因为需要全部的学生信息&#xff0c;则需要在sc表中得到符合条件的SId后与student表进行join&#xff0c;可以左连接也可以用右连接。1.1查询同…

作者头像 李华
网站建设 2026/4/25 12:34:30

DDrawCompat终极指南:如何在Windows 11上完美运行经典老游戏

DDrawCompat终极指南&#xff1a;如何在Windows 11上完美运行经典老游戏 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors/dd/…

作者头像 李华
网站建设 2026/4/25 12:33:22

Unity点云处理解决方案:Pcx插件实战指南

Unity点云处理解决方案&#xff1a;Pcx插件实战指南 【免费下载链接】Pcx Point cloud importer & renderer for Unity 项目地址: https://gitcode.com/gh_mirrors/pc/Pcx 场景&#xff1a;当Unity项目需要处理海量三维点云数据时 在三维可视化、建筑信息模型、地理…

作者头像 李华
网站建设 2026/4/25 12:30:09

ARM PrimeCell SSP接口架构与信号设计详解

1. ARM PrimeCell SSP接口架构概述ARM PrimeCell SSP&#xff08;Synchronous Serial Port&#xff09;是ARM公司设计的同步串行通信控制器IP核&#xff0c;型号PL022。作为AMBA总线生态系统中的关键外设组件&#xff0c;它通过标准化的信号接口与SoC其他模块交互。从硬件设计视…

作者头像 李华