数据质量取决于字段校验是否到位,需分四层校验:必填非空、格式类型一致、业务逻辑合理、重复唯一性,并固化为ETL独立校验层输出报告。

抓取数据的质量直接取决于字段校验是否到位。不加校验的原始数据看似完整,实则常含空值、格式错乱、逻辑矛盾或非法字符,后续分析极易出错。关键不是“抓到”,而是“抓得准”。
必填字段非空校验
明确业务中不可缺失的核心字段(如用户ID、订单时间、商品SKU),在清洗阶段强制检查是否为空或仅含空白符。
- 用 strip() + len() 判断字符串类字段是否实质为空,避免“\t\n ”这类伪装空值
- 数值型字段用 pandas.notna() 或 isinstance(x, (int, float)) and not pd.isna(x) 排除 NaN 和 None
- 对空值高发字段(如用户昵称、备注),记录空值比例并告警——若超15%,需回溯爬虫逻辑是否漏处理可选节点
格式与类型一致性校验
同一字段在不同页面或批次中应保持统一格式,否则会破坏分组、排序和聚合逻辑。
- 日期字段统一转为 datetime64[ns] 类型,并捕获解析异常(如“2023-02-30”或“昨天”),标记为待人工复核
- 手机号、身份证号等固定长度字段,用正则预筛(如 r'^1[3-9]\d{9}$'),不匹配的保留原始值并打上 format_error 标签
- 价格类字段统一转为 float,自动过滤“¥199”“199.00元”中的符号,失败则记为异常样本
业务逻辑合理性校验
脱离业务语境的校验是纸面功夫。需嵌入真实规则,识别“合法但不合理”的脏数据。
立即学习“Python免费学习笔记(深入)”;
- 订单时间不能晚于当前系统时间,且不应早于平台上线日(如2020-01-01)
- 用户年龄字段若为数值,应限定在 0–120 区间;若由生日推算,需验证生日格式及计算逻辑
- 同一订单中,“实付金额” ≤ “商品总价” + “运费” − “优惠金额”,偏差超±0.01元即触发逻辑冲突告警
重复与唯一性校验
去重不能只靠数据库主键或简单 drop_duplicates(),要结合业务主键定义(如“订单号+操作时间戳”)。
- 对疑似重复记录,先比对关键字段(如订单号、URL、哈希摘要),再人工抽样确认是否真重复或只是状态更新
- 使用 df.duplicated(subset=['order_id'], keep=False) 标出全部重复项,而非默认只删后续行
- 对带版本号的接口数据(如 /api/v2/product?id=123&v=20240501),将版本字段纳入去重维度,避免覆盖旧快照
字段校验不是一次性动作,而应固化为ETL流程中的独立校验层,输出校验报告(含各字段通过率、典型错误示例、阻断/容忍策略),让问题可追踪、可复现、可优化。不复杂但容易忽略。










