用 df.isnull().sum() 一行统计每列缺失值,注意空字符串和'NULL'需先替换为pd.NA;缺失率>5%标红,>30%进高风险栏;配合infer_dtype()校验类型,describe(include='all')识别异常,最终用Styler生成带样式的Excel报告。

用 pandas.DataFrame.isnull() 和 .sum() 快速统计每列缺失值
缺失值是最基础也最容易漏掉的数据质量问题。别写 for 循环遍历每个单元格,直接用向量化操作:df.isnull().sum() 一行就能拿到每列缺失个数。注意:isnull() 对 NaN、None、pd.NaT 都返回 True,但对空字符串 '' 或字符串 'NULL' 不识别——这些得单独处理。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 先统一把已知的脏标记(如
'N/A'、'missing')替换成pd.NA,再跑isnull() - 用
df.isnull().mean() * 100换算成百分比,更直观 - 缺失率 >5% 的列建议标红,>30% 的列直接进报告“高风险”栏
用 pd.api.types.infer_dtype() 和 .dtypes 校验每列数据类型一致性
一列标称是 int64,但混了几个字符串或 None,.dtypes 会悄悄退化成 object,你却没发现。这时候靠 pd.api.types.infer_dtype() 更靠谱——它能告诉你这列“实际像什么”:integer、string、mixed 还是 mixed-integer。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 对
object类型列,必跑infer_dtype();结果为mixed就要查异常值 -
df[col].apply(type).unique()是兜底手段,但慢,只在怀疑时临时用 - 日期列务必检查是否真为
datetime64:用pd.to_datetime(df[col], errors='coerce')转一次,再看.isnull().sum()是否突增
用 describe(include='all') + 自定义阈值识别数值/分类列异常
df.describe() 默认只吐数值列,但加 include='all' 就能一起看分类列的 unique、top、freq。关键不是看结果,而是设阈值自动报警:
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 数值列:若
std == 0或max - min == 0,整列恒定,需确认是否应删除 - 分类列:若
nunique / len(df) > 0.95,大概率是 ID 类字段,不该当维度用 - 对
object列,额外跑df[col].str.len().describe(),长度方差极大(如有的 2 字符、有的 200 字符)往往暗示格式混乱
把巡检结果组装成带样式和导出功能的报告
别用 print 拼字符串。用 pandas.DataFrame 存结果,再用 Styler 加条件格式,最后 to_excel() 一键落地:
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 构造报告 DataFrame 时,列名固定为:
column、dtype、missing_count、missing_pct、unique_ratio、inferred_type、flag(值为OK/WARN/ALERT) - 用
df.style.applymap()给flag列上色:ALERT红底白字,WARN黄底黑字 -
to_excel(..., engine='openpyxl')才支持样式保存;不加engine参数的话,样式会丢
真正麻烦的从来不是写循环,而是定义“什么叫异常”——比如“手机号列缺失率容忍 0.1%”和“备注列容忍 40%”,这种业务规则必须抽出来配成字典,硬编码在代码里迟早踩坑。


















