数据清洗的常规顺序是:先定分析任务和口径,再盘点数据并标记问题,把业务判断写成规则,按格式、重复、缺失、异常、一致性的依赖顺序处理,最后用清洗前后指标和处理日志验证结果。一套完整的数据清洗流程,通常按六个数据清洗步骤推进。
- 定任务和口径
- 盘点并标记问题
- 写规则
- 按依赖顺序处理
- 验证前后指标
- 记录日志并固化
这套顺序比直接删空值、去重麻烦一些,实际能少返工。同一个空值可能表示业务未发生,也可能是采集失败;同一条重复记录可能是接口重推,也可能是订单状态更新。处理动作取决于业务含义,先定口径才能判断哪些数据该留、该补、该隔离。
下面用一份订单样例走完整流程。样例共 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 也计入。对账结果如下:
| 指标 | 清洗前直接汇总 | 清洗后 | 说明 |
|---|---|---|---|
| 原始记录数 | 10 | 10 | 原始快照保留 |
| 主表记录数 | 10 | 6 | 删除完全重复 1 条,旧版本转历史 1 条,异常隔离 2 条 |
| 唯一订单数 | 8 | 8 | 6 条在主表,2 条在异常表 |
| 重复率 | 20% | 0% | 按原始行数减唯一订单数,再除以原始行数计算 |
| 计入 GMV 的订单数 | 7 | 4 | 排除待支付、金额缺失和异常隔离 |
| GMV | 约 100.09 万元 | 996 元 | 原始值受 999999 元和负数影响 |
| 客单价 | 约 14.30 万元 | 249 元 | 分母同步调整 |
| 客户主数据匹配率 | 87.5% | 87.5% | 1 条客户编号缺失,未强行补编号 |
| 异常隔离 | 0 | 2 | 金额异常、时间和金额逻辑错误 |
行数守恒可以写成:10 = 6 + 1 + 1 + 2。只要这个等式对不上,就说明有记录被重复删除、重复计数或漏处理。
GMV 从约 100.09 万元降到 996 元,看起来差异很大,原因可以逐项解释:999999 元的异常值、-200 元的逻辑错误、重复计算的 89 元,以及金额缺失订单被计入分母。清洗后的指标变化必须能逐项解释,解释不了就不能交付。
还要做敏感性分析。把异常表中的记录按不同假设重新计入,看结论是否改变。如果含与不含异常值会得出相反结论,应先查清异常原因,再决定是否发布分析结果。
第六步:留下日志,把规则固化
处理日志是清洗结果的一部分。 日志至少记录批次、规则编号、字段、动作、影响行数、原因、操作人、时间和原始值快照位置。样例日志如下:
| 批次 | 规则 | 字段 | 动作 | 影响行数 | 原因 |
|---|---|---|---|---|---|
| 20261024-01 | R-DUP-01 | 全字段 | 删除完全重复 | 1 | O1003 两行完全一致 |
| 20261024-01 | R-DUP-02 | order_id | 旧版本转历史 | 1 | O1005 状态更新,保留最新版本 |
| 20261024-01 | R-MISS-01 | customer_id | 标记未知 | 1 | 无法从客户主数据补全 |
| 20261024-01 | R-MISS-02 | amount | 保留空值并标记 | 1 | 已支付订单金额缺失,不参与 GMV |
| 20261024-01 | R-ANOM-01 | amount | 异常隔离 | 1 | 999999 元偏离业务范围,待核查 |
| 20261024-01 | R-LOGIC-01 | pay_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 日查阅。






