pandas.dataframe.describe()可快速识别数值列的nan、标准差为0、异常最大值等问题,但忽略非数值列;建议用describe(include='all')配合isnull().sum()等手动检查缺失率、重复行、列名空格及低唯一性等数据质量硬伤。

用 pandas.DataFrame.describe() 快速暴露数值型字段异常值
它不是万能的,但能立刻告诉你哪些列存在 NaN、标准差为 0、最大值离谱等信号。对非数值列默认跳过,这点容易被忽略——别指望它报出字符串重复率或空格问题。
实操建议:
- 先调用
df.describe(include='all')强制包含所有类型,但注意:字符串列只返回count、unique、top、freq,不计算缺失率 - 搭配
df.isnull().sum()单独统计每列缺失数,比describe更可靠 - 若某列
std为 0 且min==max,大概率是全相同值或全NaN,需人工确认是否合理
写一个轻量级 check_data_quality() 函数,覆盖常见硬伤
别依赖第三方库做“全自动”,自己写个 20 行函数更可控。核心是把检查项拆成原子逻辑,每项返回布尔+简短提示,方便后续聚合成报告。
关键检查点:
-
df.empty:空表直接报错,不往下走 -
df.duplicated().sum() > 0:记录重复行数,但注意是否允许业务重复(比如订单明细) -
df.columns.str.contains(' ').any():列名含空格会导致后续df.col_name访问失败 - 对每列跑
df[col].nunique() / len(df) :低基数列(如 99% 是 “未知”)可能需要标注
用 pd.api.types.is_string_dtype() 和 is_numeric_dtype() 区分字段语义
类型误判是数据质量陷阱的高发区。比如身份证号被读成 int64,后续转字符串会变科学计数法;手机号存成数字后首位 0 消失。
必须显式校验:
- 业务上应为字符串的字段(ID、编码、地址),用
is_string_dtype(df[col])确认,否则提醒“疑似数值型误读” - 日期字段不能只看列名含 “date”,要试
pd.to_datetime(df[col], errors='coerce')后检查isna().sum() -
object类型不等于字符串——可能是混合类型(str + int + None),用df[col].apply(type).nunique()检查
生成可读报告时,避免堆砌表格,优先输出结构化字典
别一上来就 to_html() 或 to_markdown(),调试阶段用 print(json.dumps(report_dict, indent=2)) 更快定位哪项失败。
推荐 report 字典结构:
{
"shape": [12345, 12],
"missing": {"user_id": 32, "email": 187},
"duplicates": 4,
"dtype_issues": ["order_id should be string but is int64"],
"low_cardinality": ["status", "source"]
}
这样后续导出 Excel 或发邮件都只需一层封装,也方便加告警阈值(比如 missing["email"] > 5% 就触发邮件)。
真正麻烦的是时间字段和嵌套 JSON 字段——它们的清洗逻辑往往得单独写,没法塞进通用检查函数里。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











