numpy中np.nan(pandas中NAN)

本文介绍了在Python中如何正确地检测浮点数NaN(Not a Number)值。由于直接比较两个NaN值将返回False,因此文章提供了几种有效的方法,包括使用NumPy的isnan函数、Pandas的isnull函数以及Python内置math库的isnan函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在处理数据时遇到NAN值的几率还是比较大的,有的时候需要对数据值是否为nan值做判断,但是如下处理时会出现一个很诡异的结果:

import numpy as np

np.nan == np.nan
#此时会输出为False

对np.nan进行help查看,输出如下:

Help on float object:

class float(object)
 |  float(x) -> floating point number
 |  
 |  Convert a string or number to a floating point number, if possible.
 。。。
 |  

可以得到其属于float的子类,发现有个方法可以这么用:

np.isnan(np.nan)
#这样就可以检测np.nan值了

或者可以用pandas库来检验:

import pandas as pd
pd.isnull(np.nan)
#此时一样输出为True
#同样的pd.notnull()用来判断不为nan值

还可以用python内置math来查看:

In [13]: import math

In [14]: import numpy as np

In [15]: n = np.nan

In [16]: math.isnan(np.nan)
Out[16]: True
### 关于 `numpy.nan` 和 `NAN` 的区别及使用场景 #### 定义与本质 在 Python 中,`numpy.nan` 是 NumPy 库定义的一个特殊浮点数常量,表示 IEEE 浮点标准中的“Not a Number” (NaN)[^1]。它本质上是一个浮点数值,在底层实现上遵循 IEEE 754 标准。 而 `NAN` 并不是一个特定的关键字或者内置对象;通常情况下,它是作为变量名或其他上下文中使用的缩写形式存在。如果提到大写的 `NAN` 而不是小写的 `nan`,可能是开发者自定义的命名方式或者是某些库中的一种约定表达[^2]。 因此严格来说,“`numpy.nan` vs `NAN`”更应该被理解为讨论的是 NumPy 提供的标准 NaN 常量与其他可能存在的非标准化表示之间的对比。 #### 表现行为上的差异 当涉及到具体操作时,比如逻辑运算、算术计算以及数组比较等方面: - **相等性检测** - 使用普通的等于 (`==`) 运算符无法正确判定两个 NaN 是否相同,因为按照 IEEE 规范规定任何 NaN 都不等于另一个 NaN(甚至也不等于其自身)。所以对于 Pandas Series 或者 Numpy 数组而言,推荐采用 `.equals()` 方法或者其他专用工具来进行一致性评估而不是简单依赖双等号测试。 - **缺失值标记作用** - 在数据分析领域内,无论是来自纯 Python 的 `None` 类型还是由科学计算框架引入的 `numpy.nan` ,都可以充当指示单元格为空白状态的角色。不过需要注意前者属于可变长度的对象指针结构因而占用更多内存空间同时也难以参与向量化加速过程;后者则刚好相反——固定大小且能很好地融入到高性能线性代数算法当中去。 - **转换关系** - 当准备把含有空洞的数据集迁移到外部存储介质如 SQL 数据库表里头的时候,则有必要先把所有的 float-type NaN 替换回 None 形式的 null placeholder 来适应目标系统的语法规矩。 #### 示例代码展示如何区分并处理这两种情况 下面给出一段简单的例子演示上述要点的实际应用效果: ```python import numpy as np import pandas as pd # 创建包含不同类型缺失值得序列 data = [1, None, np.nan] # 查看原始列表内容及其 dtype 属性变化后的样子 print(pd.Series(data)) """ 0 1.0 1 NaN # Note that 'None' has been converted to 'NaN' 2 NaN dtype: float64 """ # 尝试通过常规手段查找是否存在 NA-like entries na_mask = pd.isna(data) print(na_mask) """ [False, True, True] """ # 错误示范:试图直接利用 == 判断是否为 NaN comparison_result = data[-1] == np.nan print(comparison_result) # False -> This is expected according to the definition of NaN! correct_checking_method = np.isnan(data[-1]) print(correct_checking_method) # True -> Correct way to check if something really IS-a-NaN. ``` #### 总结建议 为了获得最佳性能表现并且减少潜在错误风险,在从事涉及大量数值型数据的操作任务期间应当优先选用 NumPy 扩展包所提供的专业化解决方案即 `numpy.nan`. 同样重要的一点在于始终牢记关于 NaN 特殊性质的知识点从而合理规避掉那些容易引发困惑的地方.
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值