在我正在处理的一些数据中,我遇到了 类型的数据float,其中填充了“nan”,即float('nan')。
然而,检查它并没有按预期工作:
float('nan') == float('nan')
>> False
Run Code Online (Sandbox Code Playgroud)
您可以使用 检查它math.isnan,但由于我的数据还包含字符串(例如:'nan',但也包含其他用户输入),所以不太方便:
import math
math.isnan(float('nan'))
>> True
math.isnan('nan')
>> TypeError: must be real number, not str
Run Code Online (Sandbox Code Playgroud)
在理想的情况下,我想检查一个值是否在所有可能的 NaN 值的列表中,例如:
import numpy as np
if x in ['nan', np.nan, ... ]:
# Do something
pass
Run Code Online (Sandbox Code Playgroud)
现在的问题是:
我怎样才能仍然使用这种方法,同时检查float('nan')值?以及为什么等于float('nan') == float('nan') False
Tom*_*koo 11
为什么不直接用math.isnan另一个float转换来包装您传递给的任何内容?如果它已经是一个浮点数(即float('nan')),您只需进行“冗余”调用:
import math
def is_nan(value):
return math.isnan(float(value))
Run Code Online (Sandbox Code Playgroud)
这似乎给出了您的预期结果:
>>> is_nan(float('nan'))
True
>>> is_nan('nan')
True
>>> is_nan(np.nan)
True
>>> is_nan(5)
False
>>> is_nan('5')
False
Run Code Online (Sandbox Code Playgroud)
ValueError对于非数字(除了)字符串,这仍然会引发 a 'nan'。如果这是一个问题,您可以用 换行try/except。只要float转换有效,就没有理由isnan失败。所以我们基本上是在捕获转换失败的非数字字符串float:
import math
def is_nan(value):
return math.isnan(float(value))
Run Code Online (Sandbox Code Playgroud)
任何非数字字符串肯定不是 NaN 值,所以return False。