讲师中心 微信公众号
AI工具推荐 视频效率加速

pandas 如何处理 pd.NA 与 np.nan 的混合运算行为

夏浩吖_2767

夏浩吖_2767

发布时间:2026-01-31 18:46:31

|

892人浏览过

|

来源于php中文网

原创

pd.NA在二元运算中具有“传染性”,只要参与运算的一方是pd.NA,结果即为pd.NA;而np.nan在算术和比较中返回np.nan,且np.nan==np.nan恒为False,pd.NA==pd.NA返回pd.NA。

pandas 如何处理 pd.na 与 np.nan 的混合运算行为

pd.NA 和 np.nan 混用时,运算结果会变成 pd.NA

直接说结论:pd.NA 在几乎所有二元运算(&、|、==、!=、+、> 等)中都会“传染”——只要参与运算的一方是 pd.NA,结果就返回 pd.NA,而不是 np.nan。而 np.nan 虽然也传播,但只在算术和比较中返回 np.nan,且 np.nan == np.nan 永远为 False,而 pd.NA == pd.NA 返回的是 pd.NA(三值逻辑),不是 True 也不是 False。

  • True & pd.NA → pd.NA;True & np.nan → np.nan(但注意:布尔上下文中 np.nan 会被当作 True,引发隐式转换错误)
  • 1 + pd.NA → pd.NA;1 + np.nan → np.nan
  • pd.NA == "x" → pd.NA;np.nan == "x" → False(这是关键差异:后者返回布尔值,前者返回缺失)
  • 混合列运算(如 df["a"].astype("Int64") + df["b"].astype("float64"))会自动将结果转为 Float64(nullable float),pd.NA 保持为 pd.NA,np.nan 会被统一转为 pd.NA(前提是 pandas ≥ 1.2.0)

为什么不能直接用 isna() 判断混合缺失?

pd.isna() 对 pd.NA 和 np.nan 都返回 True,看起来没问题——但陷阱在于:当列类型是 object 时,pd.isna() 可能误判 None 或字符串 "NA";更严重的是,fillna() 或 dropna() 在含混合缺失的 nullable 列(如 "Int64")中行为一致,但在普通 float64 列里遇到 pd.NA 会直接报错:TypeError: cannot convert NA to numeric。

应用程序在线商店宣传网站模板
应用程序在线商店宣传网站模板

应用程序在线商店宣传网站模板是一款提供免费应用程序在线商店宣传网站模板下载。提示:本模板调用到谷歌字体库,可能会出现页面打开比较缓慢。

下载
  • ✅ 安全做法:先统一缺失表示再操作 —— 用 df = df.convert_dtypes(dtype_backend="pyarrow")(pandas ≥ 2.0)或显式 astype 转为 nullable 类型
  • ❌ 危险操作:对 float64 列调用 .astype("Int64") —— 若含 np.nan,会静默转成 pd.NA;但若含 None,可能抛 ValueError
  • ⚠️ 注意:df.eq(np.nan) 永远返回全 False;而 df.eq(pd.NA) 返回全 pd.NA —— 别用 == 去筛缺失值

如何安全地做缺失值填充或条件过滤?

核心原则:别让 pd.NA 和 np.nan 共存于同一列;一旦混合,优先升格为 nullable 类型并用 pd.NA 作为唯一缺失标记。

  • 填充前先归一化:df.replace([np.nan, None, "N/A", ""], pd.NA).convert_dtypes()
  • 布尔索引必须用 .fillna(False) 或 .fillna(True) 转成纯布尔才能用于 .loc:df.loc[df["flag"].fillna(False)]
  • 插值(interpolate())不支持 pd.NA —— 它只处理 np.nan;所以含 pd.NA 的列需先 df["col"].replace(pd.NA, np.nan) 再插值(但会丢失整数类型)
  • 聚合函数如 sum()、mean() 对 pd.NA 默认跳过(类似 skipna=True),但 min()/max() 在全 pd.NA 时返回 pd.NA,而全 np.nan 时返回 np.nan

升级与兼容性:哪些版本能稳住?

pd.NA 自 pandas 1.0.0 引入,但直到 1.5.x 才稳定三值逻辑;2.0+ 默认启用 dtype_backend="numpy_nullable",混合缺失行为更可预测。如果你还在用 1.3.x 或更低版本,pd.NA 在某些聚合或 join 中可能意外退化为 object 或报 NotImplementedError。

  • ✅ 推荐最低版本:pandas>=2.0.3(修复了 pd.NA 在 groupby().agg() 中的传播 bug)
  • ❌ 1.0–1.4.x:pd.NA 在 merge() 中可能导致右表 key 列类型崩成 object
  • ? 检查当前行为:pd.array([1, pd.NA, 3], dtype="Int64").sum() 应返回 4;若返回 np.nan,说明底层仍走旧逻辑
真正麻烦的不是 pd.NA 本身,而是它和 np.nan 在同一 DataFrame 里共存时,你根本不知道下一次 .dtypes 或 .apply() 会触发哪条隐式转换路径。统一、尽早、强制转换,比事后 debug 快十倍。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

340

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

252

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

711

2026.04.13

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

7047

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

824

2025.10.23

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1818

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2904

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6204

2023.10.24

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app从入门到实战教程
uni-app从入门到实战教程

共0课时 | 0人学习

uni-app x harmony开发指南
uni-app x harmony开发指南

共0课时 | 0人学习

uni-app鸿蒙运行和发行
uni-app鸿蒙运行和发行

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn