Respostas:
Retorne
True
se x for um NaN (não um número) eFalse
caso contrário.
>>> import math
>>> x = float('nan')
>>> math.isnan(x)
True
math.isnan
preferido para np.isnan()
?
import numpy
leva cerca de 15 MB de RAM, enquanto que import math
leva algum 0,2 MB
numpy.isnan
é uma escolha superior, pois lida com matrizes NumPy. Se você não estiver usando NumPy, não há nenhum benefício para tomar uma dependência NumPy e passar o tempo para carregar NumPy apenas para uma verificação de NaN (mas se você está escrevendo o tipo de código que faz verificações Nan, é provável que você deve estar usando NumPy).
A maneira usual de testar um NaN é ver se é igual a si mesmo:
def isNaN(num):
return num != num
numpy.isnan(number)
diz se é NaN
ou não.
numpy.all(numpy.isnan(data_list))
também é útil se você precisar determinar se todos os elementos da lista são 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)}")
Resultado
It's pd.isna : True
It's np.isnan : True
It's math.isnan : True
ps.isna()
resolve meus problemas. Obrigado!
aqui está uma resposta trabalhando com:
float('nan')
, numpy.nan
...Um NaN implementado seguindo o padrão é o único valor para o qual a comparação de desigualdade com ele mesmo deve retornar True:
def is_nan(x):
return (x != x)
E alguns exemplos:
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)}")
Resultado:
nan : True
nan : True
55 : False
'string' : False
<function <lambda> at 0x000000000927BF28> : False
numpy.nan
é um float
objeto Python comum , assim como o tipo retornado por float('nan')
. A maioria dos NaNs encontrados no NumPy não será o numpy.nan
objeto.
numpy.nan
define seu valor NaN por conta própria na biblioteca subjacente em C . Não envolve o NaN do python. Mas agora, ambos estão em conformidade com o padrão IEEE 754, pois contam com a API C99.
float('nan') is float('nan')
(não-únicos) e np.nan is np.nan
(únicos)
np.nan
é um objeto específico, enquanto cada float('nan')
chamada produz um novo objeto. Se você fizesse nan = float('nan')
, nan is nan
também conseguiria . Se você construísse um NumPy NaN real com algo parecido np.float64('nan')
, também conseguirianp.float64('nan') is not np.float64('nan')
.
Na verdade, eu me deparei com isso, mas para mim estava checando nan, -inf ou inf. Eu apenas usei
if float('-inf') < float(num) < float('inf'):
Isso é verdadeiro para números, falso para nan e ambos inf, e gerará uma exceção para coisas como strings ou outros tipos (o que provavelmente é uma coisa boa). Além disso, isso não requer a importação de bibliotecas como matemática ou numpy (numpy é tão grande que dobra o tamanho de qualquer aplicativo compilado).
math.isfinite
não foi introduzido até o Python 3.2, então, dada a resposta do @DaveTheScientist, foi postada em 2012, não era exatamente "reinventar a roda" - a solução ainda é válida para aqueles que trabalham com o Python 2. #
ou compare o número consigo mesmo. NaN é sempre! = NaN, caso contrário (por exemplo, se for um número), a comparação deve ser bem-sucedida.
Bem, eu entrei neste post, porque tive alguns problemas com a função:
math.isnan()
Há um problema ao executar este código:
a = "hello"
math.isnan(a)
Isso gera exceção. Minha solução para isso é fazer outra verificação:
def is_nan(x):
return isinstance(x, float) and math.isnan(x)
def is_nan(x): try: return math.isnan(x) except: return False
Com python <2.6 acabei com
def isNaN(x):
return str(float(x)).lower() == 'nan'
Isso funciona para mim com python 2.5.1 em uma caixa Solaris 5.9 e com python 2.6.5 no Ubuntu 10
-1.#IND
Estou recebendo os dados de um serviço da web que envia NaN
como uma string 'Nan'
. Mas também poderia haver outros tipos de string nos meus dados, portanto, um simples float(value)
poderia gerar uma exceção. Eu usei a seguinte variante da resposta aceita:
def isnan(value):
try:
import math
return math.isnan(float(value))
except:
return False
Requerimento:
isnan('hello') == False
isnan('NaN') == True
isnan(100) == False
isnan(float('nan')) = True
try: int(value)
value
ser NaN
ou não?
NaN
(como em python, o que você poderia obter float('inf') * 0
) e, portanto, embora a string 'Hello' não seja um número, mas também não é NaN
porque NaN
ainda é um valor numérico!
int(value)
Por todas as exceções, False
será gravado.
Todos os métodos para saber se a variável é NaN ou None:
Nenhum tipo
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()
Tipo 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
Se você misturou tipos em um iterável, aqui está uma solução que não usa 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]
A avaliação de curto-circuito significa que isnan
não serão chamados valores que não são do tipo 'flutuante', como é False and (…)
avaliado rapidamente, False
sem a necessidade de avaliar o lado direito.
No Python 3.6, a verificação de um valor de string x math.isnan (x) e np.isnan (x) gera um erro. Portanto, não posso verificar se o valor fornecido é NaN ou não, se não souber de antemão que é um número. O seguinte parece resolver este problema
if str(x)=='nan' and type(x)!='str':
print ('NaN')
else:
print ('non NaN')
Parece que verificar se é igual a si mesmo
x!=x
é o mais rápido.
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)
para seqüências de caracteres no panda, pegue pd.isnull:
if not pd.isnull(atext):
for word in nltk.word_tokenize(atext):
a função como extração de recurso para 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