缺失值处理(上):缺失值识别、统计与可视化

各位同学,今天我们来聊聊数据清洗里最基础、也最绕不开的一步——缺失值处理。

说实话,我做了这么多年供应链数据分析,接手过的数据没有一套是干干净净的。库存表里缺数量、订单表里缺日期、供应商表里缺联系方式……这些太常见了。你想想看,如果连数据里缺了什么都不知道,后面的特征工程、建模预测,那不就是空中楼阁吗?

所以这一章,我们先打好地基。我会带你走完三个步骤:识别缺失值、统计缺失情况、可视化展示。嗯,咱们一步步来。

1. 缺失值识别——先看看数据到底长什么样

拿到一份数据,我个人的习惯是,先不急着写代码。我会先问自己三个问题:

  • 这份数据有多少行、多少列?
  • 哪些字段是必须有的?
  • 缺失值大概会出现在哪里?

比如在供应链场景里,订单日期、发货日期、产品数量、单价这些字段,一旦缺失,后面的分析基本就废了。而像“备注”、“客户留言”这种字段,缺了就缺了,影响不大。

好,那怎么用代码识别缺失值?最直接的方法就是 isnull() 配合 sum()

import pandas as pd

# 读取数据
df = pd.read_csv('supply_chain_data.csv')

# 查看缺失值情况
print(df.isnull().sum())

这段代码会输出每一列的缺失值数量。我在项目中遇到过,有些同事只看这个结果就下结论了,其实不够。为什么呢?因为 isnull() 只能告诉你“缺了多少”,但没法告诉你“缺在哪里”。

所以,我建议你再跑一行:

# 查看前5行缺失值分布
print(df.head().isnull())

这样你就能直观看到,哪些行、哪些列是空的。嗯,这一步虽然简单,但很管用。

2. 缺失值统计——量化分析,心里有数

识别出缺失值之后,下一步就是统计。统计什么?我个人认为,至少要看三个指标:

指标 含义 计算公式
缺失数量 该列有多少个空值 df[col].isnull().sum()
缺失比例 缺失值占总行数的百分比 df[col].isnull().mean() * 100
缺失模式 缺失值是否集中在某些行或某些列 可视化分析(见下一节)

这里我特别想强调一下缺失比例。为什么?因为比例决定了你的处理策略。

  • 如果缺失比例 < 5%,直接删除这些行,问题不大。
  • 如果缺失比例在 5% ~ 20% 之间,可以考虑填充。
  • 如果缺失比例 > 50%,这个字段基本可以放弃了。

当然,这只是经验值。我在一个库存预测项目里,遇到过“供应商评级”字段缺失了 60%。按理说该删掉,但业务方说这个字段很重要。后来我们用了聚类填充,效果还不错。所以,规则是死的,业务是活的

统计代码也很简单:

# 计算缺失比例
missing_ratio = df.isnull().mean() * 100
missing_ratio = missing_ratio[missing_ratio > 0].sort_values(ascending=False)

print("缺失比例超过0%的字段:")
print(missing_ratio)

重要提醒:统计缺失值时,别忘了检查数据类型。有时候字段看起来是数字,但实际上是字符串,比如 "N/A"、"Unknown"、"null" 这些。Pandas 默认不会把它们识别为缺失值,需要手动转换。

# 手动将常见缺失标识转换为 NaN
df.replace(['N/A', 'Unknown', 'null', ''], pd.NA, inplace=True)

3. 缺失值可视化——用 missingno 一眼看穿

统计数字虽然精确,但不够直观。你想想看,如果数据有 100 列、10 万行,光看数字你能看出缺失值的分布规律吗?很难。

所以,我强烈推荐一个库——missingno。这个库专门用来可视化缺失值,几行代码就能生成非常清晰的图表。

先安装:

pip install missingno

然后导入并使用:

import missingno as msno
import matplotlib.pyplot as plt

# 1. 缺失值矩阵图(最常用)
msno.matrix(df)
plt.show()

# 2. 缺失值条形图
msno.bar(df)
plt.show()

# 3. 缺失值热力图(看相关性)
msno.heatmap(df)
plt.show()

这三种图各有用途:

  • 矩阵图:每一行是一条数据,白色表示缺失。一眼就能看出缺失值集中在哪些行、哪些列。
  • 条形图:展示每一列的缺失比例,适合快速对比。
  • 热力图:展示列与列之间缺失值的相关性。比如,如果“发货日期”缺失时,“物流单号”也大概率缺失,那说明这两个字段的缺失是关联的。

我的小技巧:在查看矩阵图时,我会把数据按缺失率排序。这样缺失值多的列会集中在一起,更容易发现规律。missingno 的 matrix() 函数默认就会按缺失率排序,省了我不少事。

我曾经在一个供应链项目中,用热力图发现了一个有趣的现象:“实际到货日期”和“质检通过日期”的缺失高度相关。后来一查,原来是系统里这两个字段是联动的——一个没填,另一个也填不了。这个发现帮我们优化了数据录入流程。

知识体系总览

为了让你更清晰地理解本章的内容结构,我画了一张图:

缺失值处理(上)知识体系 缺失值识别 缺失值统计 缺失值可视化 isnull() + sum() 快速定位 head().isnull() 查看具体位置 缺失数量 + 缺失比例 缺失模式分析 矩阵图 / 条形图 / 热力图 missingno 库三行代码搞定 核心目标:全面了解缺失情况,为后续处理策略提供依据 识别 → 统计 → 可视化,三步走,缺一不可

避坑指南:我曾经犯过一个低级错误——在统计缺失值时,忘了考虑重复数据。结果缺失比例算出来偏低,导致我低估了问题的严重性。所以,建议你在做缺失值分析之前,先做一步去重:df.drop_duplicates(inplace=True)

好了,这一章的内容就到这里。缺失值识别、统计、可视化,这三步是数据清洗的起点。你可能会觉得简单,但越是基础的东西,越容易出错。我的建议是:每拿到一份新数据,都走一遍这个流程,形成肌肉记忆。

下一章,我们会接着讲缺失值的处理方法——删除、填充、插值,以及每种方法的适用场景。到时候见。


公众号:蓝海资料掘金营,微信deep3321