float(nan')表示nan(不是数字)。但我该如何检查呢?


当前回答

下面是一个答案:

符合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

其他回答

math.isnan()

或将数字与自身进行比较。NaN总是!=NaN,否则(例如,如果是数字),比较应成功。

当python<2.6时

def isNaN(x):
    return str(float(x)).lower() == 'nan'

这适用于Solaris 5.9机箱上的python 2.5.1和Ubuntu 10上的python 2.6.5

这里有三种方法可以测试变量是否为“NaN”。

import pandas as pd
import numpy as np
import math

# For single variable all three libraries return single boolean
x1 = float("nan")

print(f"It's pd.isna: {pd.isna(x1)}")
print(f"It's np.isnan: {np.isnan(x1)}}")
print(f"It's math.isnan: {math.isnan(x1)}}")

输出

It's pd.isna: True
It's np.isnan: True
It's math.isnan: True

我正在从一个web服务接收数据,该服务将NaN作为字符串“NaN”发送。但我的数据中也可能有其他类型的字符串,所以简单的float(value)可能会引发异常。我使用了接受答案的以下变体:

def isnan(value):
  try:
      import math
      return math.isnan(float(value))
  except:
      return False

要求:

isnan('hello') == False
isnan('NaN') == True
isnan(100) == False
isnan(float('nan')) = True

另一种方法是,如果你坚持低于2.6,你没有numpy,也没有IEEE 754支持:

def isNaN(x):
    return str(x) == str(1e400*0)