如何在Python中检查float('nan')?

Jan*_*lem 15 python numpy

在我正在处理的一些数据中,我遇到了 类型的数据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