我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

上文对python的空值None做了描述,本文描述缺失值NaN,英文解释为Not A NumberNone是单独的一个NoneType,而NaN被理解为float类型中的一员,这可能就是两者的最大区别。

苏南大叔:python编程,如何判断变量是否为缺失值NaN?NaN表述 - 缺失值nan判断
python编程,如何判断变量是否为缺失值NaN?NaN表述(图3-1)

大家好,这里是苏南大叔的“奥林匹克技术竞赛”博客,这里讲述苏南大叔和计算机代码之间的故事。测试环境:python@3.6.8pandas@1.1.5numpy@1.24.4

NaN表述

关于NaN的表述方式,有两种:

python原生对于NaN的表述是这样的:

n = float('nan')

也可以表述为:

from decimal import Decimal 
n2 = Decimal('nan')

通过numpy衍生的表述是这样的:

import numpy as np
n3 = np.nan

三者的输出,并不完全一致。

print(n, type(n))     # nan <class 'float'>
print(n2, type(n2))   # NaN <class 'decimal.Decimal'>
print(n3, type(n3))   # nan <class 'float'>

迷惑is判断【不推荐】

使用is判断的话,明显好像有些烧脑。

print(n is n)                      # True
print(n2 is n2)                    # True
print(n3 is n3)                    # True
print(n is float('nan'))           # False
print(n is Decimal('nan'))         # False
print(n is np.nan)                 # False

print(n2 is float('nan'))           # False
print(n2 is Decimal('nan'))         # False
print(n2 is np.nan)                 # False

print(n3 is float('nan'))           # False
print(n3 is Decimal('nan'))         # False
print(n3 is np.nan)                 # True  注意只有这个是true

苏南大叔:python编程,如何判断变量是否为缺失值NaN?NaN表述 - is 判断
python编程,如何判断变量是否为缺失值NaN?NaN表述(图3-2)

特别是下面这条,主打的就是叛逆不等于。下面这条怎么就等于了呢?可以推断:np.nan这是个代言词,float('nan')可能这个才是本尊。

print(n3 is np.nan)                 # True  注意只有这个是true

==自己,判断【推荐】

==自己,返回值居然是False,这是唯一一个不等于自己的变量!但是is 自己返回值True

print(n == n)           # False
print(n2 == n2)         # False
print(n3 == n3)         # False

苏南大叔:python编程,如何判断变量是否为缺失值NaN?NaN表述 - 其余判断方式
python编程,如何判断变量是否为缺失值NaN?NaN表述(图3-3)

math.isnan()

既然NaN归属于浮点数,所以,使用math.isnan()进行判断,无可厚非。

import math
print(math.isnan(n))     # True
print(math.isnan(n2))    # True
print(math.isnan(n3))    # True

numpy.isnan()

科学计算numpy,也比如存在着一个isnan()函数判断。

import numpy as np
print(np.isnan(n))       # True
# print(np.isnan(n2))    # TypeError: ufunc 'isnan' not supported for the input type
print(np.isnan(n3))      # True

这个表面:float('nan')Decimal('nan'),也是有一定区别的,否则不会报错。对不?

dataframe.isnull()

并不是用来做这个事情的,不过也是可以做相关计算。略显复杂。

from pandas import DataFrame
print(DataFrame({n}).isnull().all()[0])   # True
print(DataFrame({n2}).isnull().any()[0])  # True
print(DataFrame({n3}).isnull().any()[0])  # True

正无穷、负无穷

表述1表述2表述3
正无穷float("inf")暂无暂无
负无穷float("-inf")暂无暂无
缺失值float("nan")Decimal('nan'))np.nan

正负无穷的情况,就待后续了。这里仅仅列出以表示两者和NaN并不是一回事。

相关文章

结语

不想写结语了,没有啥心情。连这些盗版我文章的兄弟,都不抄袭我的结语。郁闷...

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python