pandas 缺失值处理完整教程:快速识别、定位与填补 NaN、NA、NaT 的实用策略
【免费下载链接】pandasFlexible and powerful data analysis / manipulation library for Python, providing labeled data structures similar to R data.frame objects, statistical functions, and much more项目地址: https://gitcode.com/gh_mirrors/pa/pandas
pandas 是 Python 最强大的灵活数据分析库,提供带标签的数据结构、统计函数与海量 I/O 能力。而真实数据几乎总有"空洞":缺失的年龄、没填的日期、空白的金额……本教程带你快速掌握 pandas 缺失值处理的核心方法——认识 NaN、NA、NaT 三种哨兵值,学会用pd.isna识别、用聚合定位、用fillna等策略填补,让新手也能从容处理脏数据。
一、先认识三种"缺失值":NaN、NA 与 NaT
pandas 用不同的**哨兵值(sentinel)**来表示"这里没数据",它们各司其职:
| 哨兵值 | 适用数据类型 | 特点 |
|---|---|---|
NaN(即np.nan) | 普通浮点、object 列 | 最常用;整数列出现缺失会被升级为浮点 |
NA(pd.NA) | 可空类型:Int64、Boolean、string、Arrow 类型 | 保持原始类型不丢失,参与运算时结果也是 NA |
NaT(pd.NaT) | datetime64、timedelta64、Period时间类型 | 专门表示"无效日期/时间" |
💡 一个直观例子:日期列里缺失的位置会显示为NaT而不是NaN,因为日期无法用浮点数表示。None在 object 列中同样会被 pandas 视为缺失。
识别这些值统一交给两个函数pd.isna和pd.notna(互为取反),它们能正确识别上述所有哨兵值以及None。核心实现在 pandas/core/dtypes/missing.py,其内部会分派到按数组批量判断的快速路径_isna_array;notna定义于 pandas/core/dtypes/missing.py。
二、识别缺失值:用 pd.isna 一眼看穿
处理缺失值的第一步是"看见"它。pd.isna可以直接作用在标量、Series、DataFrame 上,返回布尔结果——True 表示该位置是缺失值。
import pandas as pd import numpy as np ser = pd.Series([pd.Timestamp("2020-01-01"), pd.NaT]) pd.isna(ser) # [False, True] df = pd.DataFrame({"a": [1, None, 3], "b": [np.nan, "x", "y"]}) df.isna() # 逐单元格返回 True/False 矩阵📌 官方文档对这部分有完整的演示与讨论,推荐精读:doc/source/user_guide/missing_data.rst。
常见误区:千万不要用==来判断缺失值!np.nan == np.nan返回False,pd.NA == pd.NA返回NA——只有isna才是可靠的"照妖镜"。
三、定位缺失值:快速找出"空洞"在哪里
知道有缺失后,下一步是定位:哪些列缺失多?哪一行全空?三个技巧快速摸底:
- 统计每列缺失个数:
df.isna().sum(),一行命令输出各列缺失计数; - 筛选含缺失的行:
df[df.isna().any(axis=1)]找出任意列缺失的行,all(axis=1)则只留整行缺失的行; - 直接删除:
dropna方法支持how='any'/'all'、subset(只看部分列)等参数,定义见 pandas/core/generic.py(fillna同处,ffill/bfill/interpolate分别在该文件第 7398、7500、8123 行)。
df.isna().sum() # 各列缺失数量 df.dropna() # 删除任意含缺失的行 df.dropna(how="all") # 只删除整行全缺失的行四、填补缺失值:fillna 与四大经典策略
删除不是唯一答案——多数场景下填补更能保留数据量。pandas 提供了层层递进的工具:
| 方法 | 作用 | 适用场景 |
|---|---|---|
fillna(value) | 用常量/字典统一填充 | 缺失意义明确(如默认值 0、"未知") |
ffill()/bfill() | 前向 / 后向填充 | 时间序列、价格类数据,沿用上一个有效值 |
interpolate() | 线性等方法插值 | 数值型连续数据,按邻近值推算 |
limit=参数 | 限制填充次数 | 防止长段缺失被"一刀切"填平 |
⚠️ 特别提醒:整数列混入NaN后会自动变成浮点型。如果希望保留整数语义,可先convert_dtypes()转为Int64等可空类型,此时缺失值即为NA,填补逻辑实现在 pandas/core/arrays/masked.py 的fillna中,类型全程不丢失。
五、避坑清单:新手最容易踩的 3 个坑
- 坑 1:用
df == np.nan找缺失 → 结果永远是空。请改用df.isna()。 - 坑 2:对
pd.NA直接取布尔(如if x:)会抛TypeError,因为缺失值的真假无法判断;先isna判断或提前fillna即可。 - 坑 3:整数列
reindex引入NaN后类型变成float64。若在意精度与类型,优先使用可空整数类型(如"Int64"),让缺失以NA形式存在。
六、小结与延伸阅读
一句话总结 pandas 缺失值处理流水线:用isna识别 → 用isna().sum()定位 → 用dropna删除或fillna/ffill/interpolate填补。掌握这套组合拳,绝大多数脏数据都能迎刃而解。
更多细节可查阅官方用户指南:doc/source/user_guide/missing_data.rst,缺失值判断的实现源码:pandas/core/dtypes/missing.py。
【免费下载链接】pandasFlexible and powerful data analysis / manipulation library for Python, providing labeled data structures similar to R data.frame objects, statistical functions, and much more项目地址: https://gitcode.com/gh_mirrors/pa/pandas
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考