用 df.isna().mean() 一行可得每列缺失值比例,因 isna() 返回布尔 dataframe,mean() 计算 true 占比;需注意 object 列中空字符串等“伪缺失”需先清洗,大数据量应复用 na_mask 避免重复计算。

用 isna() + mean() 一行搞定
直接对 DataFrame 调用 df.isna().mean() 就能得到每列缺失值比例(0~1 的浮点数),比手动遍历 count() 和 shape 更简洁、更向量化。
原因很简单:isna() 返回布尔 DataFrame,True 表示缺失,mean() 对布尔值求均值等价于计算 True 占比。
-
df.isna().sum()给的是绝对数量,要除以行数才得比例,多一步且易忘axis=0 -
df.info()只显示非空计数,还得自己算比例,不适合批量或后续处理 - 避免写
df.apply(lambda x: x.isna().mean())—— 多余 wrapper,性能略差
保留小数位数与结果格式控制
默认返回 float64,但常需转成百分比或限制精度便于查看。别用 round() 后再乘 100,容易因浮点误差导致 99.999999% 这种显示。
调用 Cutout.Pro 视觉处理 API 进行背景移除、人像抠图和照片增强,支持文件上传与图片 URL 输入。
- 转百分比字符串:
(df.isna().mean() * 100).round(2).astype(str) + '%' - 保留 3 位小数浮点:
df.isna().mean().round(3) - 只看缺失率 >5% 的列:
missing_ratio = df.isna().mean(); missing_ratio[missing_ratio > 0.05]
注意 object 列中的 “伪缺失”
isna() 对 object 类型列能识别 None、np.nan,但识别不了空字符串 ''、字符串 'NULL' 或 'N/A' —— 它们不是缺失值,只是业务意义上的“空”。
- 若需把特定字符串也视作缺失,先做清洗:
df.replace({'': np.nan, 'N/A': np.nan, 'NULL': np.nan}),再调isna().mean() - 检查是否混入伪缺失:
df.select_dtypes('object').apply(lambda s: s.isin(['', 'N/A', 'NULL']).sum()) - 混合类型列(如含 int 和 str)可能被转为
object,此时np.nan仍可被isna()捕获,但要注意 dtype 推断是否合理
大数据量下避免重复计算
如果后续还要统计非缺失数、填充率或画缺失矩阵图,别反复调 isna() —— 每次都生成新布尔 DataFrame,浪费内存和时间。
- 一次计算存起来:
na_mask = df.isna(),然后复用:na_mask.mean()、na_mask.sum(axis=1)(每行缺失数)、~na_mask(非缺失掩码) - 内存敏感时,对超大 DataFrame 可按块处理,但注意
mean()是全局统计,不能简单取块均值;正确做法是用na_mask.sum()和总行数相除 - 如果只关心某几列,先子集再算:
df[['col_a', 'col_b']].isna().mean(),比全量快
真正麻烦的从来不是怎么算比例,而是搞清哪些值该算作缺失——业务定义和数据清洗永远比一行代码更耗神。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










