df.isnull().mean()可直接计算每列缺失值比例,因True/False被转为1/0求均值;支持切片、精度控制及绘图,但需注意伪缺失和混合类型问题。

怎么用 isnull() 和 mean() 一行算出每列缺失值比例
直接对布尔矩阵求均值,是最快最稳的方式:df.isnull().mean()。因为 True 被当 1、False 当 0 处理,均值就是空值占比。
- 别用
sum() / len(df)—— 容易因索引不连续或含重复行导致分母不准 - 如果只关心某几列,先切片再调用:
df[['col_a', 'col_b']].isnull().mean() - 结果是
float64类型的Series,默认保留小数点后 6 位;需要控制精度可链式调用.round(4) - 注意:
NaN、None、pd.NaT都会被识别为缺失;但字符串'NaN'或空字符串''不算
为什么 df.info() 显示非空数却算不出比例
df.info() 输出的是每列的非空计数(non-null),但它不直接提供比例,而且默认只打印前/后若干行,容易漏看长 DataFrame 中间列的缺失情况。
- 尤其当列数多于显示阈值(默认约 80 列),中间大量列的
non-null值根本不会出现 -
df.info(verbose=True)可强制全量输出,但仍是文本格式,没法直接参与后续计算或绘图 - 真正要批量分析或导出,还是得靠
df.isnull().mean()+to_frame()转成结构化数据
用 matplotlib 或 seaborn 快速画缺失率条形图
把缺失率转成 DataFrame 后,就能直接喂给绘图库。关键是要设好 x 轴标签旋转,否则列名挤在一起看不见。
- 推荐写法:
missing_rate = df.isnull().mean().round(4).to_frame('missing_ratio')<br>missing_rate.plot(kind='barh', figsize=(6, 8))<br>plt.xlabel('Missing Ratio')</br>plt.xticks(rotation=0) - 用
seaborn更简洁:sns.barplot(data=missing_rate.reset_index(), y='index', x='missing_ratio')
- 别直接对
Series调用.plot()后加plt.yticks()—— 列名顺序可能错乱,尤其当列名含中文或特殊字符时 - 如果缺失率全为 0,图表会塌成一条线;建议加个判断:
if missing_rate.max() == 0: print("No missing values found")
处理 object 列里隐藏的“伪缺失”(如空格、'NULL' 字符串)
isnull() 对这类值完全免疫,它们会算作有效值,导致真实缺失率被低估。
立即学习“Python免费学习笔记(深入)”;
- 先检查是否有明显可疑值:
df.select_dtypes('object').apply(lambda s: s.str.strip().isin(['', 'NULL', 'null', 'None']).sum()) - 清洗后再统计:
df_clean = df.copy(); df_clean[col] = df_clean[col].str.strip().replace({'NULL': pd.NA, 'null': pd.NA}) - 注意:
replace()默认不修改原Series,必须赋值;且pd.NA是 pandas 的新缺失标记,比np.nan更兼容字符串列 - 混合类型列(如既有数字又有字符串)可能被推断为
object,但str方法会报错;需加astype(str)或用apply(type)排查
df.isnull().mean() 前,最好先用 df.head().T 和 df.dtypes 扫一眼数据长什么样。










