pandas 缺失值处理指南:理解 NaN 语义、传播规则与 isna/dropna/ffill/fillna 实战
2026/9/19 4:32:05 网站建设 项目流程

pandas 缺失值处理指南:理解 NaN 语义、传播规则与 isna/dropna/ffill/fillna 实战

【免费下载链接】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 官方文档中comparison系列文档所引用的缺失值说明(missing_intro.rst 与配套的 missing.rst)为骨架,系统讲解 pandas 中缺失数据的核心语义:NaN哨兵值、在数值运算中的传播规则、聚合时的默认跳过行为,以及isna/notna/dropna/ffill/fillna等常用处理手段。读完本文,你将掌握 pandas 与 SAS、Stata 等工具在缺失值处理上的核心差异,并能在实际数据分析中正确处理"空值"。文中所有示例均来自当前仓库官方文档,并辅以源码级佐证,可放心复制运行。


一、pandas 如何表示缺失数据:NaN哨兵值

pandas 使用特殊的浮点值NaN(Not a Number)来表示缺失数据。这是 pandas 与 R、SAS、Stata 等统计工具对齐的核心设计——正如官方文档 comparison_with_sas.rst 和 comparison_with_stata.rst 中强调的:

Both pandas and SAS have a representation for missing data. / Both pandas and Stata have a representation for missing data.

pandas 会在不同 dtype 下选用不同的哨兵值来表示缺失,这一策略在用户指南 missing_data.rst 中有完整说明:对于传统 dtype(如float64object)使用NaN;而对于可空 dtype(nullable dtypes,如Int64booleanstring),则使用pd.NA作为统一的缺失哨兵。这一点在官方文档中也有明确表述:"The missing value sentinel used will be chosen based on the dtype."

NaN有两个核心语义,理解它们是掌握 pandas 缺失值处理的钥匙:

  1. NaN不等于自身NaN == NaNFalse,因此不能用常规的==比较来筛选缺失值。这一点也是 pandas 与 SAS、Stata 的关键差异——后两者允许直接把缺失值与哨兵值(SAS 中的.,Stata 中的.)做相等比较来过滤,而 pandas 必须使用专门的isna()/notna()方法。官方文档在 comparison_with_sas.rst 中给出了 SAS 的对比写法(if value_x = .),并明确指出 "missing data cannot be compared to its sentinel value"。

  2. NaN具有传染性(propagation):缺失值会在算术与比较运算中自动传播,详见后文。

二、核心语义一:缺失值在数值运算中的传播

文档 missing_intro.rst 明确指出:pandas 中缺失数据的许多语义与其他工具相同,例如缺失数据会穿透数值运算(propagates through numeric operations)

我们沿用官方文档中由merge产生的outer_join数据来演示。该数据来自 merge.rst 中定义的外连接示例:

import pandas as pd import numpy as np df1 = pd.DataFrame({"key": ["A", "B", "C", "D"], "value": np.random.randn(4)}) df2 = pd.DataFrame({"key": ["B", "D", "D", "E"], "value": np.random.randn(4)}) outer_join = df1.merge(df2, on=["key"], how="outer")

由于key"C""E"的行只存在于一侧,外连接结果中对应列会出现NaN。对这样的两列做加法:

outer_join["value_x"] + outer_join["value_y"]

结果中,只要任一操作数为NaN,该位置的结果就是NaN——缺失值"传染"了整个运算。这与 R、SAS、Stata 等工具的行为一致,也是数据清洗阶段必须优先处理缺失值的原因。官方文档将此语义概括为 "missing data propagates through numeric operations, and is ignored by default for aggregations"(见 missing_intro.rst)。

三、核心语义二:聚合运算默认忽略缺失值

NaN的第二条核心语义是:默认情况下,聚合运算会跳过缺失值。官方文档用sum()演示:

outer_join["value_x"].sum()

value_x列中即使包含NaNsum()默认也会忽略它们,只对非缺失值求和(等价于skipna=True)。这一默认行为在用户指南 missing_data.rst 中有完整说明:pandas 的聚合与归约(reduction)操作默认跳过缺失值;如果你希望把缺失值纳入计算(例如希望结果为NaN以暴露数据问题),可以显式传入skipna=False

outer_join["value_x"].sum(skipna=False)

同样的规则适用于meanstdcumsum等各类归约运算——例如ser.std(skipna=False)就会在存在缺失值时返回NaN(参见 missing_data.rst 中的完整示例)。在用户指南中还有专门说明:pandas 默认在聚合时忽略 NA,如需将 NA 纳入计算,使用skipna=False

实战提示:聚合时"忽略缺失值"意味着mean()可能基于更少的样本计算。在统计严谨性要求较高的场景下,建议同时用isna()统计各列缺失数量,或使用skipna=False让缺失值显式暴露出来。

四、缺失值的检测:isna 与 notna

由于NaN无法与自身直接比较,pandas 提供了Series.isna()Series.notna()两个方法用于检测缺失值。官方文档 missing.rst 给出的典型用法是与布尔索引结合,筛选缺失或非缺失的行:

# 筛选 value_x 为缺失值的行 outer_join[outer_join["value_x"].isna()] # 筛选 value_x 非缺失的行 outer_join[outer_join["value_x"].notna()]
  • isna()对每个元素返回布尔值,缺失为True,非缺失为False
  • notna()isna()的取反。

此外,DataFrame层面也有对应的DataFrame.isna()/DataFrame.notna()方法,返回与原数据同形状的布尔 DataFrame。常用的配套统计是df.isna().sum(),用于快速查看每列的缺失数量。这些方法的实现细节可进一步参考 pandas 源码 missing.py,其内部会针对不同 dtype(浮点、对象、时间、可空类型等)统一识别各自的缺失哨兵。

五、缺失值的常用处理手段

pandas 提供了"多种处理缺失数据的方法"(官方文档 missing.rst 明确写道 "pandas provides a variety of methods to work with missing data",并链接到完整的 用户指南 missing_data.rst)。以下是官方对比文档中的三类核心操作:

5.1 删除缺失行:dropna()

outer_join.dropna()

dropna()默认删除任何含有缺失值的行(how="any")。常用参数包括:

  • how="all":仅当整行全部为缺失时才删除;
  • subset=["col1", "col2"]:只依据指定列判断;
  • axis=1:改为删除含有缺失值的列;
  • thresh=N:保留至少 N 个非缺失值的行。

5.2 前向填充:ffill()

outer_join.ffill()

ffill()(forward fill)用前一行的值填充缺失值,在时间序列与面板数据中尤其常用。相关变体:

  • bfill():用后一行(backward fill)的值填充;
  • limit=N:限制连续填充的最大数量,防止缺失区间过长时无限前向传播。

5.3 用指定值替换:fillna()

outer_join["value_x"].fillna(outer_join["value_x"].mean())

fillna()用指定值(标量、字典、Series 或方法)填充缺失值。官方文档示范了最经典也最常见的填充策略——用该列的均值填充缺失值。其他常见策略包括:

# 用固定值填充 outer_join["value_x"].fillna(0) # 用中位数填充 outer_join["value_x"].fillna(outer_join["value_x"].median()) # 用前一个有效值填充(与 ffill 等价) outer_join["value_x"].fillna(method="ffill")

需要注意的是,fillna(method=...)在新版本中已建议改用ffill()/bfill()方法。

六、与 SAS、Stata 的缺失值处理对比

missing_intro.rstmissing.rst两个 include 文件被同时嵌入到 SAS 与 Stata 的对比页面中(见 comparison_with_sas.rst 与 comparison_with_stata.rst),其对比逻辑非常清晰:

对比维度pandasSASStata
缺失表示NaN(浮点哨兵),可空类型用pd.NA数值缺失用.数值缺失用.
过滤缺失值isna()/notna()布尔索引if value_x = .(可直接与哨兵比较)list if value_x == .(可直接与哨兵比较)
关键差异NaN不能与自身相等比较,必须用专用方法缺失值可与哨兵直接比较缺失值可与哨兵直接比较
聚合默认行为默认跳过缺失(skipna=True依赖具体过程依赖具体命令

这一差异正是官方文档反复强调的核心知识点:SAS 与 Stata 中缺失值有确定的字面量(.),可以直接写value_x = .来筛选;而 pandas 中NaN != NaN,任何==比较都会失败,必须借助isna()/notna()。这也解释了为什么 pandas 的缺失值检测 API 被设计为独立的布尔方法而非运算符重载。

七、深入源码:NaN 的底层实现与传播机制

在 pandas 内部,NaN是 NumPy 的浮点nan,由 numpy_.py 中的NumpyExtensionArray等数组实现承载。缺失值检测(isna)的底层逻辑集中在 missing.py,它会对不同 dtype 进行分派:

  • 对浮点类型,直接用np.isnan判断;
  • 对对象类型,识别np.nanNonepd.NaT等;
  • 对可空扩展类型,检查各自的_data掩码。

算术运算中的传播行为则来源于 NumPy 自身语义:nan + x恒为nan。pandas 没有为传统 dtype 的算术覆盖这一行为,而是保持与 NumPy 一致;而对于可空 dtype(如Int64boolean),缺失值语义由 masked.py 中的BaseMaskedArray通过布尔掩码实现,此时算术与比较运算的传播规则由 pandas 自行定义(缺失与任何值运算的结果仍是缺失)。

聚合时"默认忽略缺失值"的实现核心是各归约函数中的skipna=True默认参数,其计算路径会先剔除缺失值再做归约。想深入了解全部细节,可直接阅读官方缺失数据处理完整指南,其中涵盖了哨兵值选择、pd.NA传播规则、比较操作行为、skipna语义以及fillna/dropna/interpolate等全部高级用法。

八、小结

本文以官方对比文档中的缺失值章节为核心,完整梳理了 pandas 缺失数据处理的五大要点:

  1. 表示:传统 dtype 用NaN,可空 dtype 用pd.NA
  2. 传播NaN会穿透数值运算,任何包含缺失的运算结果仍是缺失;
  3. 聚合summean等默认忽略缺失(skipna=True),可用skipna=False显式纳入;
  4. 检测NaN不能与自身比较,必须用isna()/notna()配合布尔索引过滤;
  5. 处理dropna()删除、ffill()/bfill()填充、fillna()用均值/中位数/固定值等替换。

与 SAS、Stata 相比,pandas 缺失值的最大差异在于"哨兵值不可比较",因此形成了以isna/notna为核心的独特方法论。掌握这套语义,你就能在不同工具之间平滑迁移,并在真实数据项目中正确处理空值。

【免费下载链接】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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询