news 2026/9/3 13:08:32

pandas 缺失值处理完整教程:快速识别、定位与填补 NaN、NA、NaT 的实用策略

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
pandas 缺失值处理完整教程:快速识别、定位与填补 NaN、NA、NaT 的实用策略

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 列最常用;整数列出现缺失会被升级为浮点
NApd.NA可空类型:Int64Booleanstring、Arrow 类型保持原始类型不丢失,参与运算时结果也是 NA
NaTpd.NaTdatetime64timedelta64Period时间类型专门表示"无效日期/时间"

💡 一个直观例子:日期列里缺失的位置会显示为NaT而不是NaN,因为日期无法用浮点数表示。None在 object 列中同样会被 pandas 视为缺失。

识别这些值统一交给两个函数pd.isnapd.notna(互为取反),它们能正确识别上述所有哨兵值以及None。核心实现在 pandas/core/dtypes/missing.py,其内部会分派到按数组批量判断的快速路径_isna_arraynotna定义于 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返回Falsepd.NA == pd.NA返回NA——只有isna才是可靠的"照妖镜"。

三、定位缺失值:快速找出"空洞"在哪里

知道有缺失后,下一步是定位:哪些列缺失多?哪一行全空?三个技巧快速摸底:

  1. 统计每列缺失个数df.isna().sum(),一行命令输出各列缺失计数;
  2. 筛选含缺失的行df[df.isna().any(axis=1)]找出任意列缺失的行,all(axis=1)则只留整行缺失的行;
  3. 直接删除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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 13:08:18

基于RVB2601与YoC平台打造网络时钟:从Wi-Fi对时到OLED显示的物联网实践

简介:本资源是面向嵌入式与物联网开发者的RVB2601平台网络闹钟实战项目,解决传统闹钟时间不准、无法远程同步等痛点,适用于初学者入门IoT设备开发及工程师拓展NTP时间同步、Wi-Fi联网、低功耗外设控制等综合能力。压缩包共2777个文件&#xf…

作者头像 李华
网站建设 2026/9/3 13:07:20

Coze工作流实战:从零构建自动化数据分析报告流水线

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/3 13:07:06

Gin框架凭什么快40倍?Benchmark数据揭秘零分配路由的极致性能

Gin框架凭什么快40倍?Benchmark数据揭秘零分配路由的极致性能 【免费下载链接】gin Gin is a high-performance HTTP web framework written in Go. It provides a Martini-like API but with significantly better performance—up to 40 times faster—thanks to …

作者头像 李华
网站建设 2026/9/3 13:02:51

本地部署AI情感叙事项目:从环境搭建到API集成的全流程指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/3 13:02:48

Python模拟音乐榜单走势:以洛德Billboard Hot 100为例的数据分析实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华