float(nan')表示nan(不是数字)。但我该如何检查呢?
当前回答
我进入这篇文章,因为我在功能方面遇到了一些问题:
math.isnan()
运行此代码时出现问题:
a = "hello"
math.isnan(a)
它引发了异常。我的解决方案是再做一次检查:
def is_nan(x):
return isinstance(x, float) and math.isnan(x)
其他回答
测试NaN的通常方法是查看它是否等于自身:
def isNaN(num):
return num != num
比较pd.isna、math.isnan和np.isnan及其处理不同类型对象的灵活性。
下表显示了是否可以使用给定方法检查对象类型:
+------------+-----+---------+------+--------+------+
| Method | NaN | numeric | None | string | list |
+------------+-----+---------+------+--------+------+
| pd.isna | yes | yes | yes | yes | yes |
| math.isnan | yes | yes | no | no | no |
| np.isnan | yes | yes | no | no | yes | <-- # will error on mixed type list
+------------+-----+---------+------+--------+------+
pd.isna文件
检查不同类型缺失值的最灵活方法。
所有答案都没有涵盖pd.isna的灵活性。虽然math.isnan和np.isnan将为NaN值返回True,但您无法检查None或字符串等不同类型的对象。这两个方法都会返回错误,因此检查混合类型的列表会很麻烦。而pd.isna是灵活的,它将为不同类型返回正确的布尔值:
In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: missing_values = [3, None, np.NaN, pd.NA, pd.NaT, '10']
In [4]: pd.isna(missing_values)
Out[4]: array([False, True, True, True, True, False])
另一种方法是,如果你坚持低于2.6,你没有numpy,也没有IEEE 754支持:
def isNaN(x):
return str(x) == str(1e400*0)
下面是一个答案:
符合IEEE 754标准的NaN实现例如:python的NaN:float(NaN'),numpy.NaN。。。任何其他对象:string或其他任何对象(遇到异常时不会引发异常)
按照标准实现的NaN是唯一一个与自身的不平等比较应返回True的值:
def is_nan(x):
return (x != x)
还有一些例子:
import numpy as np
values = [float('nan'), np.nan, 55, "string", lambda x : x]
for value in values:
print(f"{repr(value):<8} : {is_nan(value)}")
输出:
nan : True
nan : True
55 : False
'string' : False
<function <lambda> at 0x000000000927BF28> : False
似乎检查它是否等于自身(x!=x)是最快的。
import pandas as pd
import numpy as np
import math
x = float('nan')
%timeit x != x
44.8 ns ± 0.152 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%timeit math.isnan(x)
94.2 ns ± 0.955 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%timeit pd.isna(x)
281 ns ± 5.48 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit np.isnan(x)
1.38 µs ± 15.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
推荐文章
- 如何在Python中进行热编码?
- 如何嵌入HTML到IPython输出?
- 在Python生成器上使用“send”函数的目的是什么?
- 是否可以将已编译的.pyc文件反编译为.py文件?
- Django模型表单对象的自动创建日期
- 在Python中包装长行
- 如何计算两个时间串之间的时间间隔
- 我如何才能找到一个Python函数的参数的数量?
- 您可以使用生成器函数来做什么?
- 将Python诗歌与Docker集成
- 提取和保存视频帧
- 使用请求包时出现SSL InsecurePlatform错误
- 如何检索Pandas数据帧中的列数?
- except:和except的区别:
- 错误:“字典更新序列元素#0的长度为1;2是必需的”