缺失值可视化前须先统一转为np.nan并验证真实缺失形态,因missingno对伪缺失无感;matrix()中白色条带不等于无缺失,可能因截断或过滤导致;heatmap()计算的是两列同时缺失的频率占比,非统计学相关性。

缺失值可视化前必须检查数据类型
Missingno 对 None、np.nan、pd.NA 敏感,但对空字符串 ''、字符串 'NULL'、数值 -999 等“伪缺失”完全无感。直接调用 msno.matrix() 可能显示“无缺失”,实际却存在大量脏数据。
实操建议:
- 先运行
df.isnull().sum()和df.applymap(lambda x: isinstance(x, str) and x.strip() == '').sum()(或对每列单独判断)确认真实缺失形态 - 用
df.replace({'': np.nan, 'NULL': np.nan, -999: np.nan})统一转为np.nan,再重置索引(df.reset_index(drop=True)),避免索引错位影响热力图排序 - 若含时间列,确保其为
datetime64类型,否则msno.heatmap()会跳过该列计算相关性
matrix() 图中白色条带不等于“没缺失”
msno.matrix() 默认按缺失密度排序行(即把缺失多的样本排在顶部),白色条带只是表示该位置值不可见——可能是缺失,也可能是该列本身被过滤(比如设置了 sort='sample' 但样本数远超显示上限)。
常见误判场景:
- 数据行数 > 1000 时,默认只渲染前 1000 行,底部大片白色 = 被截断,不是全量无缺失
- 传入
filter='top'后,只保留缺失率最高的前 20 列,其余列直接不画,空白区域≠无缺失 - 若某列全为
np.nan,它会在图中显示为纯白竖条,但容易被当成“正常空白”,需结合df.isnull().mean()验证
heatmap() 的相关系数不是皮尔逊,而是二元关联度
msno.heatmap() 计算的是“两列同时缺失”的频率占比,公式为 count(col_a_null & col_b_null) / count(col_a_null | col_b_null),和统计学上的相关性无关。值高只说明“一起丢数据”,不代表变量间有业务关联。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
使用注意点:
- 当某列缺失率极低(如
- 结果矩阵对角线恒为 1,但不能据此判断单列稳定性;需配合
msno.dendrogram()观察缺失模式分层 - 若想看真实数值相关性,应先用
df.dropna()清洗,再调用seaborn.heatmap(df.corr())
导出高清图时字体和布局易崩
msno.matrix() 默认用 matplotlib backend 渲染,但未显式设置 dpi 和 figure size,保存为 PNG 常出现文字糊、列名截断、颜色条错位。
稳妥做法:
- 加参数
figsize=(12, 8)控制画布,fontsize=10防止列名重叠 - 保存前调用
plt.tight_layout(),再用plt.savefig('missing.png', dpi=300, bbox_inches='tight') - 若含中文列名,需提前设置字体:
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS'],否则显示方块
缺失模式往往藏在细节里:排序逻辑、采样阈值、伪缺失识别、导出参数——这些地方不动手试一遍,图看着漂亮,结论可能全错。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










