ThinkingAI Logo
返回博客列表

数据清洗怎么做?

用订单样例讲清数据清洗的六步流程:定口径、盘点问题、写规则、按顺序处理、前后验证、日志固化,并给出缺失、重复和异常值的判定方法与对照指标。

2026-10-2916分钟
数据清洗怎么做?

数据清洗的常规顺序是:先定分析任务和口径,再盘点数据并标记问题,把业务判断写成规则,按格式、重复、缺失、异常、一致性的依赖顺序处理,最后用清洗前后指标和处理日志验证结果。一套完整的数据清洗流程,通常按六个数据清洗步骤推进。

  • 定任务和口径
  • 盘点并标记问题
  • 写规则
  • 按依赖顺序处理
  • 验证前后指标
  • 记录日志并固化

这套顺序比直接删空值、去重麻烦一些,实际能少返工。同一个空值可能表示业务未发生,也可能是采集失败;同一条重复记录可能是接口重推,也可能是订单状态更新。处理动作取决于业务含义,先定口径才能判断哪些数据该留、该补、该隔离。

下面用一份订单样例走完整流程。样例共 10 行,包含完全重复、状态更新、客户编号缺失、金额缺失、金额异常和日期逻辑错误,属于演示数据,不对应真实企业。清洗在分析链路中的位置,以及取数、建模、可视化的衔接,可以参考《AI 数据分析如何落地?取数、清洗、建模、可视化》。

一套可交付的清洗结果,至少包括四样东西:问题清单、规则表、处理日志、清洗前后指标对照。 只有处理后的表,没有这四样,别人无法复核,也很难在下一次复用。

数据清洗要解决哪些问题

数据清洗是识别并修正原始数据中不准确、不完整、不一致或不合理的内容,让数据能稳定用于分析、报表和模型。数据清洗也常被称为数据清理,指向的任务相同。它处理的典型问题包括重复记录、缺失值、异常值、格式不统一、类型错误、单位或口径不一致、关联失败。

国内常用的数据质量评价框架可以参考 GB/T 36344-2018《信息技术 数据质量评价指标》。中国软件评测中心依据这个标准给出六项指标:规范性、完整性、准确性、一致性、时效性和可访问性。落到一次具体的清洗任务里,可以这样用:

质量维度在订单表里看什么常见问题
规范性日期、金额、编码是否符合约定格式日期混用斜杠和短横线;编码被转成数字后丢失前导零
完整性必填字段是否有值客户编号为空;支付金额为空
准确性值是否与真实业务一致金额多录一个零;订单状态与实际支付不符
一致性同一实体在不同表、不同字段间是否矛盾支付时间早于下单时间;客户编号在客户主数据中找不到
时效性数据是否按预期时间到达昨天的订单今天还没同步;状态更新延迟
可访问性有权限的人能否正常读取字段权限配置错误;分区不可读

清洗范围要跟当前分析任务挂钩。 算 GMV 时,金额、支付状态、订单号是必查字段;做渠道分析时,渠道字段和渠道映射表才进入必查范围。把所有字段都按最高标准清洗,成本高,也容易把与本次分析无关的差异当成错误。

第一步:先定分析任务和口径

动手前先写一张任务卡,至少回答六个问题:

  • 业务问题是什么,结论要给谁用
  • 分析粒度是订单、用户、商品还是事件
  • 时间范围和数据分区是什么
  • 核心指标及分母怎么定义
  • 哪些字段是必需字段,哪些字段可以缺
  • 什么结果算完成,谁来验收

以样例为例,任务定为:计算 2026 年 7 月 1 日至 3 日的支付 GMV 和客单价,粒度为订单,GMV 只计已支付且金额可核验的订单,客单价的分母用计入 GMV 的订单数。

这张任务卡会直接改变处理规则。样例里的 O1004 是待支付订单,支付时间为空属于业务未发生,不能按缺失值补一个时间;O1006 是已支付但金额为空,属于关键字段缺失,不能用一个平均数把 GMV 补出来。两个空值看起来一样,处理方式完全不同。

口径要写清单位和边界。 金额是元还是万元,含税还是未税,退款是否冲减,跨天支付算哪一天,这些规则不先定,清洗后的数字仍然对不上。

第二步:盘点数据,列出问题清单

盘点阶段先不改数,只做检查和标记。常用检查项包括:

  • 总行数、字段数、字段类型
  • 候选主键及唯一值数量
  • 每个字段的空值数量和空值比例
  • 分类字段的取值分布
  • 数值字段的最小值、最大值、分位数
  • 日期字段的范围和格式
  • 重复记录数量和重复类型
  • 与其他表的关联匹配率
  • 明显的逻辑冲突

样例的盘点结果如下:

检查项结果
总行数10 行
唯一订单数8 个
完全重复O1003 有 2 行完全一致
状态重复O1005 有 2 个版本,待支付和已支付
空值客户编号 1 条、支付时间 1 条、金额 1 条、渠道 1 条
格式问题O1004 的下单时间写成 2026/7/2
数值异常O1007 金额 999999 元;O1008 金额 -200 元
逻辑冲突O1008 支付时间早于下单时间
关联问题8 个订单中 7 个能匹配客户主数据,匹配率 87.5%

问题清单要标严重程度。 会影响核心指标的错误标为阻断级,比如金额缺失、支付状态与支付时间矛盾;只影响展示的错误标为一般级,比如渠道名称大小写不一致。严重程度决定处理顺序和是否需要暂停出数。

盘点时保留原始快照。后面每一步处理都基于快照生成新表,原始表不覆盖。这样出现争议时可以回溯,也能重跑规则。

第三步:把业务判断写成规则

数据清洗规则要写到能直接执行的程度。规则写成条件、动作、例外三部分,避免只写“缺失值用均值填充”这种无法执行的话。样例的规则表可以这样写:

问题先判断什么处理规则不能做什么
完全重复是否为同一业务事件的同一版本全字段一致时保留一条,记录删除条数不看主键就对全表去重
业务重复同一主键是否代表状态变化按更新时间保留最新版本,旧版本转入历史表只保留旧状态,或把历史版本直接删掉
缺失未发生、未采集、未填写,还是不适用能关联补全的先补全;分类字段填“未知”并标记;核心指标缺失回溯源系统或隔离给 GMV、支付金额、留存等核心指标填均值
异常录入错误、单位错误,还是真实极值有源可查的修正;合理极值保留并标记;无法判断的隔离批量删除所有超出阈值的值
格式不一致是否影响计算、排序、关联统一日期、金额、编码和枚举,建立映射表把带前导零的编码直接转成数字
逻辑冲突时间、金额、状态之间是否矛盾回溯源系统;无法修正的隔离,不参与指标只改一个字段,让记录看起来合理
关联失败主数据缺失、编码错误,还是同步延迟补主数据、修编码、延迟重跑,并记录匹配率用名称模糊匹配后直接认定同一实体

规则要有负责人和版本号。业务负责人确认口径,数据人员实现规则,分析人员做结果复核。规则变更要记录生效时间,避免上个月和这个月用不同口径却没人知道。

第四步:按依赖顺序处理

处理顺序会影响结果。比较稳妥的顺序是:统一格式和类型、去重、处理缺失、处理异常、校验一致性和关联、生成派生字段。

先统一格式,是因为文本键里的空格、大小写、全半角差异会让同一条记录看起来不同;先去重,是因为重复行会放大缺失比例和指标分母;异常检测放在填充之前,是因为填充值会改变分布,掩盖原始异常;一致性和关联校验放在最后,是因为它们依赖前面字段已经标准化。

统一格式和字段类型

日期统一成 YYYY-MM-DD HH:mm:ss,并明确时区。金额统一单位和精度,明确含税口径。客户编号、订单号、商品编码这类字段保留为文本,避免前导零丢失。渠道、状态这类枚举字段建立映射表,把“信息流”“信息流广告”“feed”归到同一个值。样例里的 2026/7/2 统一写成 2026-07-02 08:40。

格式统一的目标是让数据能正确计算、排序和关联。只把表格改整齐,计算仍然出错,这一步就没有完成。

处理重复记录

去重前先确定业务主键。订单表常用订单号,订单明细用订单号加明细行号,用户表用客户编号,埋点表用设备号加事件时间加事件名。主键选错,去重就会删掉真实业务。阿里云开发者社区在数据清洗实践文章中也强调,去重前要先确定业务主键和保留规则。

重复分两类。完全重复是多个字段完全一致,常见于接口重推、同步任务重跑或人工重复录入,可以保留一条。业务重复是同一个主键出现多个版本,比如 O1005 先待支付、后已支付,这代表状态变化,不能简单删除。处理方式是按更新时间保留最新版本,把旧版本转入历史表,既保证当前表唯一,也保留状态轨迹。

SQL 数据清洗里可以用窗口函数保留最新版本:

<code class="language-sql">WITH ranked AS (
  SELECT
    *,
    ROW_NUMBER() OVER (
      PARTITION BY order_id
      ORDER BY updated_at DESC, record_id DESC
    ) AS rn
  FROM raw_orders
)
SELECT *
FROM ranked
WHERE rn = 1;
</code>

record_id 用于更新时间相同时兜底,没有这个字段就换成能区分版本的字段。不同数据库的窗口函数语法略有差异,执行前先在测试表验证。

行为流水、状态变更日志、用于样本增强的重复样本,通常不去重。判断标准是这条记录是否代表一个新的业务事件,而不是它看起来是否重复。

处理缺失值

缺失值先分类,再决定动作。常见含义有四类:

  • 未发生:待支付订单的支付时间为空
  • 未采集:订单有渠道,但埋点没取到渠道
  • 未填写:客户编号应该填,但录单时漏了
  • 不适用:已完成订单的取消原因字段为空

处理优先级可以是:关联补全、业务推算、标记未知或隔离、删除。客户编号为空,先查客户主数据或原始订单;商品分类为空,关联商品档案;金额等于数量乘单价,只有在数量和单价都可靠时才推算。分类字段无法补全时,填“未知”并保留缺失标记,后续统计可以单独看这一组。数值字段用均值或中位数填充,只适合辅助分析,不能把填充值当成真实值写进核心指标。

GMV、支付金额、留存、转化这类直接进入结论的指标,缺失时应回溯源系统或隔离,不用统计值填充。 填充会把猜测混进结果,而且很难在报表上被发现。

删除要谨慎。辅助字段缺失且不影响本次分析,可以不纳入;关键字段缺失且无法回溯的记录,从对应指标中排除,但不轻易删除整行,因为其他字段可能仍然有效。缺失比例阈值按字段重要性和分析目标定,不同教材和工具会给出不同阈值,不能直接套用。

处理异常值

异常值检测先用业务规则,再用统计方法。业务规则包括:金额大于 0;支付时间不早于下单时间;已支付订单必须有支付时间;折扣率不超过 100%;退款金额不超过支付金额。统计方法常用箱线图的 1.5 倍四分位距、3 倍标准差和 Z 分数,适合发现偏离分布的数值,但只能提示,不能自动判定错误。Z 分数是数值偏离均值的标准差倍数,绝对值越大,偏离越明显。

样例里 O1007 的 999999 元明显偏离正常订单金额,O1008 的 -200 元和支付早于下单则违反业务逻辑。处理时先查源系统:如果是录入错误,修正;如果是单位错误,换算;如果是真实大额订单或促销极值,保留并标记;如果暂时无法判断,转入异常表,不参与本次指标,同时做含与不含的敏感性对比。

异常值不等于错误值。 大促期间的订单金额、新业务的极端转化率,可能是真实业务表现。直接删掉极值,会让分析结论偏乐观或偏悲观。

校验一致性和关联关系

一致性校验看字段之间是否矛盾。时间上,下单时间不晚于支付时间,支付时间不晚于退款时间;金额上,订单金额等于数量乘单价减折扣,GMV 等于计入订单的支付金额之和;状态上,已支付应有支付时间,已取消不应有发货记录。

关联校验看主外键是否匹配。订单表的客户编号应能在客户主数据中找到,商品编号应能在商品档案中找到。关联后至少检查四件事:无法匹配的记录数、一对多匹配、主键是否仍然唯一、关联前后行数是否异常放大。O1002 的客户编号为空,匹配率为 87.5%,这类记录可以计入 GMV,但做客户分层时要单独标记,不能硬塞一个客户编号。

生成派生字段

基础字段清洗完成后,再生成分析用的派生字段,比如支付日期、订单月份、是否支付、客单价、渠道分组。派生字段要写清公式和版本,避免不同报表各算一套。

单位换算也放在这一步。元与万元、含税与未税、自然月与财务月、订单额与回款额,都要在字段名或口径文档里写清楚。很多数字对不上,常见原因是统计口径不同。

第五步:用指标验证清洗前后

清洗完成后,不能只看表是否整齐,要用指标对账。至少做三类检查:

  • 行数守恒:原始行数等于主表保留行数、删除行数、转入历史行数和异常隔离行数之和。
  • 指标对账:清洗前后的订单数、GMV、客单价、缺失条数、重复率、关联匹配率能否解释。
  • 抽样复核:从主表、历史表和异常表各抽若干条,核对原始值、处理动作和当前值。

样例的清洗前直接汇总,是把原始 10 行全部纳入,重复的 O1003 算两次,O1006 的缺失金额按 0 处理,O1007 和 O1008 也计入。对账结果如下:

指标清洗前直接汇总清洗后说明
原始记录数1010原始快照保留
主表记录数106删除完全重复 1 条,旧版本转历史 1 条,异常隔离 2 条
唯一订单数886 条在主表,2 条在异常表
重复率20%0%按原始行数减唯一订单数,再除以原始行数计算
计入 GMV 的订单数74排除待支付、金额缺失和异常隔离
GMV约 100.09 万元996 元原始值受 999999 元和负数影响
客单价约 14.30 万元249 元分母同步调整
客户主数据匹配率87.5%87.5%1 条客户编号缺失,未强行补编号
异常隔离02金额异常、时间和金额逻辑错误

行数守恒可以写成:10 = 6 + 1 + 1 + 2。只要这个等式对不上,就说明有记录被重复删除、重复计数或漏处理。

GMV 从约 100.09 万元降到 996 元,看起来差异很大,原因可以逐项解释:999999 元的异常值、-200 元的逻辑错误、重复计算的 89 元,以及金额缺失订单被计入分母。清洗后的指标变化必须能逐项解释,解释不了就不能交付。

还要做敏感性分析。把异常表中的记录按不同假设重新计入,看结论是否改变。如果含与不含异常值会得出相反结论,应先查清异常原因,再决定是否发布分析结果。

第六步:留下日志,把规则固化

处理日志是清洗结果的一部分。 日志至少记录批次、规则编号、字段、动作、影响行数、原因、操作人、时间和原始值快照位置。样例日志如下:

批次规则字段动作影响行数原因
20261024-01R-DUP-01全字段删除完全重复1O1003 两行完全一致
20261024-01R-DUP-02order_id旧版本转历史1O1005 状态更新,保留最新版本
20261024-01R-MISS-01customer_id标记未知1无法从客户主数据补全
20261024-01R-MISS-02amount保留空值并标记1已支付订单金额缺失,不参与 GMV
20261024-01R-ANOM-01amount异常隔离1999999 元偏离业务范围,待核查
20261024-01R-LOGIC-01pay_time、amount异常隔离1支付早于下单且金额为负

规则固化有三种常见做法。数据量小、一次性分析,可以用 Excel 或 Python 处理,但要把规则和日志留下。数据在数据库里、需要反复跑,可以把清洗 SQL 放进调度任务,加上行数和指标校验。多系统、多版本、需要权限和审计的场景,适合把规则放进数据链路或分析平台,由平台统一执行和监控。

如果日常需要反复回答“这张表为什么少了 300 单”“哪个渠道的异常订单最多”,可以让具备分析能力的 Agent 承接一部分初查。ThinkingAI 的企业级 AI Agent 平台 Agentic Engine 支持多 Agent 协作,数据分析 Agent 可以用自然语言发起分析、继续追问、做归因和可视化,适合把异常发现、下钻和结果汇总连起来。ThinkingAI 已服务全球超 1500 家企业、接入产品超 8000 款。需要说明的是,Agent 能加速发现和复核,主键、口径和处理规则仍要由业务确认,输出结果也要回到原始数据验证。如果关心 Agent 如何接进现有数仓,可以看《数据分析 Agent 怎么接进现有数仓?不打扰架构的落地方法》。

规则需要持续维护。渠道、价格、状态机、埋点方案变化时,要重新检查规则;平时至少监控行数、缺失率、重复率、关联匹配率和核心指标波动,发现异常及时告警。原始层、清洗层、应用层分开存放,任何一层出问题都能往回查。如果你正在选工具,可以看《2026年最值得推荐的8款数据清洗工具》;本文只讲流程和规则。

数据清洗常见问题

数据清洗一定要写代码吗?

不一定。数据量小、只做一次,Excel 或 Python 都能完成;数据在数据库里、需要反复执行,SQL 更合适;多系统、多人协作、需要权限和审计,适合放到数据平台或 Agent 平台。判断标准是数据量、执行频率、复核要求和权限要求。工具本身的高低声誉不构成判断依据。

清洗后数据量变少,正常吗?

正常,但减少的每一条都要有去向。完全重复可以删除,旧版本可以转历史,异常记录可以隔离,关键字段缺失的记录可以从某个指标中排除。行数守恒对不上,或者减少的记录无法解释,就不正常。

缺失值都能用均值填充吗?

不能。均值填充会改变分布,也会把猜测混进结果。辅助字段、探索性分析可以谨慎使用;GMV、支付金额、留存、转化等核心指标,应回溯源系统或隔离。分类字段更适合填“未知”并保留标记。

异常值都要删除吗?

不用。先查原因,再决定修正、保留还是隔离。录入错误和单位错误可以修正;真实的大额订单、促销极值应保留并标记;无法判断的记录转入异常表,做敏感性分析。批量删除所有极值,容易把真实业务一起删掉。

清洗规则应该由谁定?

业务负责人定口径和例外,数据人员实现规则,分析人员复核结果。规则要版本化,变更要记录时间和原因。只有数据人员单方面定规则,容易把业务上合理的值当成错误。

数据清洗做一次就够了吗?

不够。数据每天更新,业务规则也会变。需要把清洗放进固定链路,持续监控行数、缺失率、重复率、关联匹配率和核心指标;渠道、价格、状态机调整时,重新检查规则。

参考资料

  • 中国软件评测中心,《助力夯实数据底座,强化数据质量测评》,引用 GB/T 36344-2018《信息技术 数据质量评价指标》,https://cstc.org.cn/info/1081/245525.htm,2026 年 10 月 24 日查阅。
  • 阿里云开发者社区,《数据清洗到底怎么做?从删空值到异常处理,10 种常用方法一次讲透》,https://developer.aliyun.com/article/1748508,2026 年 10 月 24 日查阅。

准备好构建你的 Agent 团队了吗

立即体验 Agentic Engine, 让 AI 成为真正的团队成员

ThinkingAI Big Logo
电话咨询