Answers:
返回
True
如果x为NaN(非数字),以及False
其他。
>>> import math
>>> x = float('nan')
>>> math.isnan(x)
True
math.isnan
首选np.isnan()
?
import numpy
占用大约15 MB的RAM,而import math
占用大约0.2 MB
numpy.isnan
则它是一个绝佳选择,因为它可以处理NumPy数组。如果您不使用NumPy,那么获取NumPy依赖项并花时间加载NumPy仅用于NaN检查是没有好处的(但是,如果您编写的是执行NaN检查的代码,则很可能应该使用NumPy)。
测试NaN的通常方法是查看其是否与自身相等:
def isNaN(num):
return num != num
numpy.isnan(number)
告诉您是否NaN
存在。
numpy.all(numpy.isnan(data_list))
如果您需要确定列表中的所有元素是否均为nan,它也很有用
all(map(math.isnan, [float("nan")]*5))
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
ps.isna()
解决了我的问题。谢谢!
这是使用的答案:
float('nan')
,numpy.nan
...遵循该标准实现的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
numpy.nan
是常规的Python float
对象,就像所返回的类型一样float('nan')
。您在NumPy中遇到的大多数NaN都不是numpy.nan
对象。
float('nan') is float('nan')
非唯一)和np.nan is np.nan
(唯一)
np.nan
是一个特定的对象,而每次float('nan')
调用都会产生一个新对象。如果您这样做了nan = float('nan')
,那么您也会得到的nan is nan
。如果您使用构造一个实际的 NumPy NaN np.float64('nan')
,则您将得到np.float64('nan') is not np.float64('nan')
太多。
我实际上只是碰到了这个,但是对我来说,它正在检查nan,-inf或inf。我刚用过
if float('-inf') < float(num) < float('inf'):
这对于数字是正确的,对于nan和两个inf都是错误的,并且会为字符串或其他类型的东西引发异常(这可能是一件好事)。而且,这不需要导入任何库,例如math或numpy(numpy是如此之大,它会使任何已编译应用程序的大小增加一倍)。
math.isfinite
直到Python 3.2才被引入,因此@DaveTheScientist的答案发布于2012年,它并不是完全“重新发明轮子”-解决方案仍然适用于使用Python 2的用户
好吧,我进入了这篇文章,因为我在功能上遇到了一些问题:
math.isnan()
运行此代码时出现问题:
a = "hello"
math.isnan(a)
它引发异常。我的解决方案是再次进行检查:
def is_nan(x):
return isinstance(x, float) and math.isnan(x)
def is_nan(x): try: return math.isnan(x) except: return False
随着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
-1.#IND
我正在从NaN
以字符串形式发送的Web服务接收数据'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
try: int(value)
value
是NaN
或不是?
NaN
(就像在python中可以从中得到的一样float('inf') * 0
),因此尽管字符串“ Hello”不是数字,但它也不NaN
是因为NaN
它仍然是数字值!
int(value)
For All异常,False
将被写入。
判断变量是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
如果您在迭代器中包含混合类型,则以下是不使用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
不会调用非浮点类型的值,因为可以False and (…)
快速评估而False
无需评估右侧。
对于熊猫字符串,请使用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