Respuestas:
Devuelve
True
si x es un NaN (no un número), y de loFalse
contrario.
>>> import math
>>> x = float('nan')
>>> math.isnan(x)
True
math.isnan
prefiere a np.isnan()
?
import numpy
toma alrededor de 15 MB de RAM, mientras que import math
toma unos 0,2 MB
numpy.isnan
es una opción superior, ya que maneja los arreglos NumPy. Si no está usando NumPy, no tiene ningún beneficio tomar una dependencia de NumPy y pasar el tiempo para cargar NumPy solo para un chequeo de NaN (pero si está escribiendo el tipo de código que hace los cheques de NaN, es probable que deba usar NumPy).
La forma habitual de probar un NaN es ver si es igual a sí mismo:
def isNaN(num):
return num != num
numpy.isnan(number)
te dice si es NaN
o no.
numpy.all(numpy.isnan(data_list))
también es útil si necesita determinar si todos los elementos de la lista son 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)}")
Salida
It's pd.isna : True
It's np.isnan : True
It's math.isnan : True
ps.isna()
resuelve mis problemas ¡Gracias!
Aquí hay una respuesta trabajando con:
float('nan')
, numpy.nan
...Un NaN implementado siguiendo el estándar es el único valor para el cual la comparación de desigualdad consigo misma debería devolver True:
def is_nan(x):
return (x != x)
Y algunos ejemplos:
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)}")
Salida:
nan : True
nan : True
55 : False
'string' : False
<function <lambda> at 0x000000000927BF28> : False
numpy.nan
es un float
objeto Python normal , al igual que el tipo devuelto por float('nan')
. La mayoría de los NaN que encuentres en NumPy no serán el numpy.nan
objeto.
numpy.nan
define su valor NaN por sí solo en la biblioteca subyacente en C . No envuelve el NaN de Python. Pero ahora, ambos cumplen con el estándar IEEE 754 ya que confían en la API C99.
float('nan') is float('nan')
(no único) y np.nan is np.nan
(único)
np.nan
es un objeto específico, mientras que cada float('nan')
llamada produce un nuevo objeto. Si lo nan = float('nan')
hicieras, entonces también lo conseguirías nan is nan
. Si has construido un real NumPy NaN con algo así como np.float64('nan')
, a continuación, se obtendría np.float64('nan') is not np.float64('nan')
demasiado .
De hecho, me encontré con esto, pero para mí estaba buscando nan, -inf o inf. Acabo de usar
if float('-inf') < float(num) < float('inf'):
Esto es cierto para los números, falso para nan y ambos inf, y generará una excepción para cosas como cadenas u otros tipos (que probablemente sea algo bueno). Además, esto no requiere importar ninguna biblioteca como matemática o numpy (numpy es tan grande que duplica el tamaño de cualquier aplicación compilada).
math.isfinite
no se introdujo hasta Python 3.2, por lo que, dada la respuesta de @DaveTheScientist publicada en 2012, no fue exactamente "reinventar [la rueda]" - la solución sigue siendo
o compara el número consigo mismo. NaN es siempre! = NaN, de lo contrario (por ejemplo, si es un número) la comparación debería tener éxito.
Bueno, entré en esta publicación, porque he tenido algunos problemas con la función:
math.isnan()
Hay un problema cuando ejecuta este código:
a = "hello"
math.isnan(a)
Se plantea una excepción. Mi solución para eso es hacer otra verificación:
def is_nan(x):
return isinstance(x, float) and math.isnan(x)
def is_nan(x): try: return math.isnan(x) except: return False
Con python <2.6 terminé con
def isNaN(x):
return str(float(x)).lower() == 'nan'
Esto funciona para mí con python 2.5.1 en un cuadro de Solaris 5.9 y con python 2.6.5 en Ubuntu 10
-1.#IND
Estoy recibiendo los datos de un servicio web que se envía NaN
como una cadena 'Nan'
. Pero también podría haber otros tipos de cadenas en mis datos, por lo que un simple float(value)
podría arrojar una excepción. Usé la siguiente variante de la respuesta aceptada:
def isnan(value):
try:
import math
return math.isnan(float(value))
except:
return False
Requisito:
isnan('hello') == False
isnan('NaN') == True
isnan(100) == False
isnan(float('nan')) = True
try: int(value)
value
ser NaN
o no?
NaN
(como en Python de lo que podría obtener float('inf') * 0
), y por lo tanto, aunque la cadena 'Hola' no es un número, ¡pero tampoco lo es NaN
porque NaN
todavía es un valor numérico!
int(value)
Para todas las excepciones, False
se escribirá.
Todos los métodos para saber si la variable es NaN o Ninguna:
Ninguno 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
Si tiene tipos mixtos en un iterable, aquí hay una solución que no 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]
La evaluación de cortocircuito significa que isnan
no se invocará en valores que no sean del tipo 'flotante', como False and (…)
se evalúa rápidamente False
sin tener que evaluar el lado derecho.
En Python 3.6, verificar un valor de cadena x math.isnan (x) y np.isnan (x) genera un error. Por lo tanto, no puedo verificar si el valor dado es NaN o no si no sé de antemano que es un número. Lo siguiente parece resolver este problema
if str(x)=='nan' and type(x)!='str':
print ('NaN')
else:
print ('non NaN')
Parece que comprobar si es igual a sí mismo
x!=x
Es el más 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 cadenas en panda tome pd.isnull:
if not pd.isnull(atext):
for word in nltk.word_tokenize(atext):
la función como extracción de características 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