libreria - python 3.6 math module
¿Cómo puedo verificar los valores de NaN? (13)
float(''nan'')
en Nan (no un número). ¿Pero cómo lo compruebo? Debería ser muy fácil, pero no puedo encontrarlo.
Para nan de tipo float
>>> 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
Aquí hay una respuesta trabajando con:
- Python no único NaN:
float(''nan'')
- Número único NaN (singleton):
np.nan
- cualquier otro objeto: cadena o lo que sea (no genera excepciones si se encuentran)
Aquí está:
import numpy as np
def is_nan(x):
return (x is np.nan or x != x)
Y algunos ejemplos:
values = [float(''nan''), np.nan, 55, "string", lambda x : x]
for value in values:
print "{:<8} : {}".format(repr(value), is_nan(value))
Salida:
nan : True
nan : True
55 : False
''string'' : False
<function <lambda> at 0x000000000927BF28> : False
Bueno, ingresé a esta publicación porque tuve algunos problemas con la función:
math.isnan()
Hay un problema cuando ejecutas este código:
a = "hello"
math.isnan(a)
Se plantea la excepción. Mi solución para eso es hacer otro cheque:
def is_nan(x):
return isinstance(x, float) and math.isnan(x)
Con python <2.6 terminé con
def isNaN(x):
return str(float(x)).lower() == ''nan''
Esto me funciona con python 2.5.1 en una caja de Solaris 5.9 y con python 2.6.5 en Ubuntu 10
De hecho, acabo de encontrarme 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 (lo que probablemente sea bueno). Además, esto no requiere importar bibliotecas como math o numpy (numpy es tan malditamente grande que duplica el tamaño de cualquier aplicación compilada).
Estoy recibiendo los datos de un servicio web que 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 generar 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
La forma habitual de probar un NaN es ver si es igual a sí mismo:
def isNaN(num):
return num != num
Otro método si está atascado en <2.6, no tiene números y no tiene soporte IEEE 754:
def isNaN(x):
return str(x) == str(1e400*0)
Todos los métodos para saber si la variable es NaN o Ninguno:
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
para cuerdas en panda tomar pd.isnull:
if not pd.isnull(atext):
for word in nltk.word_tokenize(atext):
La función como función de extracción 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
Comprueba si el float x es un NaN (no un número). Los NaN son parte de los estándares IEEE 754. La operación como, pero sin limitarse a, inf * 0, inf / inf o cualquier operación que involucre un NaN, por ejemplo, nan * 1, devuelve un NaN.
Nuevo en la versión 2.6.
>>> import math
>>> x=float(''nan'')
>>> math.isnan(x)
True
>>>
o comparar el número a sí mismo. NaN siempre es! = NaN, de lo contrario (por ejemplo, si es un número), la comparación debería tener éxito.
numpy.isnan(number)
te dice si es NaN
o no en Python 2.5.