如何检查NaN值?

时间:2009-06-03 13:19:55

标签: python math

float('nan')导致Nan(不是数字)。但我该如何检查呢?应该很容易,但我找不到它。

18 个答案:

答案 0 :(得分:954)

math.isnan()

  

检查浮点数x是否为NaN(不是数字)。 NaN是IEEE 754标准的一部分。操作类似于但不限于inf * 0,inf / inf或涉及NaN的任何操作,例如, nan * 1,返回NaN。

     

2.6版中的新功能。

>>> import math
>>> x=float('nan')
>>> math.isnan(x)
True
>>> 

答案 1 :(得分:277)

测试NaN的常用方法是查看它是否与自身相同:

def isNaN(num):
    return num != num

答案 2 :(得分:112)

numpy.isnan(number)告诉您Python 2.5中是否为NaN

答案 3 :(得分:24)

我实际上只是碰到了这个,但对我来说,它正在检查nan,-inf或inf。我刚用过

if float('-inf') < float(num) < float('inf'):

这对于数字来说是正确的,对于nan和两个inf都是假的,并且会为字符串或其他类型(这可能是一件好事)引发异常。此外,这不需要导入任何像math或numpy这样的库(numpy非常大,它可以使任何已编译的应用程序的大小翻倍)。

答案 4 :(得分:21)

这是一个使用答案的答案:

  • python 非唯一 NaN:float('nan')
  • numpy unique NaN(singleton):np.nan
  • 任何其他对象:字符串或其他(遇到异常时不会引发异常)

这是:

import numpy as np

def is_nan(x):
    return (x is np.nan or x != x)

还有一些例子:

values = [float('nan'), np.nan, 55, "string", lambda x : x]
for value in values:
    print "{:<8} : {}".format(repr(value), is_nan(value))

输出:

nan      : True
nan      : True
55       : False
'string' : False
<function <lambda> at 0x000000000927BF28> : False

答案 5 :(得分:20)

math.isnan()

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

答案 6 :(得分:17)

另一种方法,如果你坚持使用&lt; 2.6,你没有numpy,并且你没有IEEE 754支持:

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

答案 7 :(得分:12)

似乎正在检查它是否与自己相等

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)

答案 8 :(得分:10)

我输入这篇文章,因为我的功能存在一些问题:

math.isnan()

运行此代码时出现问题:

a = "hello"
math.isnan(a)

它引发异常。 我的解决方案是再次检查:

def is_nan(x):
    return isinstance(x, float) and math.isnan(x)

答案 9 :(得分:8)

使用python&lt; 2.6我最终得到了

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

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

答案 10 :(得分:7)

可以通过以下三种方法测试变量是否为“ 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

答案 11 :(得分:4)

我从网络服务接收数据,该服务将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

答案 12 :(得分:3)

判断变量是NaN还是None的所有方法:

无类型

In [1]: from numpy import math

In [2]: a = None
In [3]: not a
Out[3]: True

In [4]: len(a or ()) == 0
Out[4]: True

In [5]: a == None
Out[5]: True

In [6]: a is None
Out[6]: True

In [7]: a != a
Out[7]: False

In [9]: math.isnan(a)
Traceback (most recent call last):
  File "<ipython-input-9-6d4d8c26d370>", line 1, in <module>
    math.isnan(a)
TypeError: a float is required

In [10]: len(a) == 0
Traceback (most recent call last):
  File "<ipython-input-10-65b72372873e>", line 1, in <module>
    len(a) == 0
TypeError: object of type 'NoneType' has no len()

NaN类型

In [11]: b = float('nan')
In [12]: b
Out[12]: nan

In [13]: not b
Out[13]: False

In [14]: b != b
Out[14]: True

In [15]: math.isnan(b)
Out[15]: True

答案 13 :(得分:2)

在Python 3.6中,检查字符串值x math.isnan(x)和np.isnan(x)会引发错误。 所以我无法检查给定的值是否为NaN,如果我事先不知道它是一个数字。 以下似乎可以解决这个问题

if str(x)=='nan' and type(x)!='str':
    print ('NaN')
else:
    print ('non NaN')

答案 14 :(得分:1)

如何从混合数据类型列表中删除NaN(浮动)项目

如果您在迭代器中包含混合类型,则可以使用不使用numpy的解决方案:

from math import isnan

Z = ['a','b', float('NaN'), 'd', float('1.1024')]

[x for x in Z if not (
                      type(x) == float # let's drop all float values…
                      and isnan(x) # … but only if they are nan
                      )]
['a', 'b', 'd', 1.1024]

短路评估意味着isnan不会在非'float'类型的值上调用,因为(False and …会迅速评估为False,而不必评估正确的-手侧。

答案 15 :(得分:0)

  

对于float类型的nan

>>> import pandas as pd
>>> value = float(nan)
>>> type(value)
>>> <class 'float'>
>>> pd.isnull(value)
True
>>>
>>> value = 'nan'
>>> type(value)
>>> <class 'str'>
>>> pd.isnull(value)
False

答案 16 :(得分:0)

比较 pd.isnamath.isnannp.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.isnannp.isnan 将为 True 值返回 NaN,但您无法检查不同类型的对象,例如 None 或字符串。这两种方法都会返回错误,因此检查混合类型的列表会很麻烦。这 while 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])

答案 17 :(得分:-1)

对于熊猫字符串,请输入pd.isnull:

if not pd.isnull(atext):
  for word in nltk.word_tokenize(atext):

作为NLTK特征提取的功能

def act_features(atext):
features = {}
if not pd.isnull(atext):
  for word in nltk.word_tokenize(atext):
    if word not in default_stopwords:
      features['cont({})'.format(word.lower())]=True
return features