float('nan')
donne Nan (pas un nombre). Mais comment puis-je vérifier? Devrait être très facile, mais je ne le trouve pas.
Vérifie si le float x est un NaN (pas un nombre). NaNs font partie des normes IEEE 754. Opération comme inf * 0, inf/inf ou toute opération impliquant un NaN, par ex. nan * 1, retourne un NaN.
Nouveau dans la version 2.6.
>>> import math
>>> x=float('nan')
>>> math.isnan(x)
True
>>>
Le moyen habituel de tester un NaN est de voir s'il est égal à lui-même:
def isNaN(num):
return num != num
numpy.isnan(number)
vous indique s'il s'agit de NaN
ou non dans Python 2.5.
En fait, je viens juste d’être confronté à cela, mais pour moi, il vérifiait nan, -inf ou inf. Je viens d'utiliser
if float('-inf') < float(num) < float('inf'):
Ceci est vrai pour les nombres, false pour nan et les deux inf, et lèvera une exception pour des choses comme des chaînes ou d'autres types (ce qui est probablement une bonne chose). De plus, cela ne nécessite pas l’importation de bibliothèques telles que math ou numpy (numpy est tellement gros qu’il double la taille de toute application compilée).
ou comparer le nombre à lui-même. NaN est toujours! = NaN, sinon (par exemple, si est un nombre), la comparaison devrait aboutir.
voici une réponse avec:
float('nan')
np.nan
C'est ici:
import numpy as np
def is_nan(x):
return (x is np.nan or x != x)
Et quelques exemples:
values = [float('nan'), np.nan, 55, "string", lambda x : x]
for value in values:
print "{:<8} : {}".format(repr(value), is_nan(value))
Sortie:
nan : True
nan : True
55 : False
'string' : False
<function <lambda> at 0x000000000927BF28> : False
Une autre méthode si vous êtes bloqué sur <2.6, vous n'avez pas numpy et vous n'avez pas le support IEEE 754:
def isNaN(x):
return str(x) == str(1e400*0)
Eh bien je suis entré dans ce post, parce que j'ai eu quelques problèmes avec la fonction:
math.isnan()
Il y a un problème lorsque vous exécutez ce code:
a = "hello"
math.isnan(a)
Il soulève une exception… .. Ma solution est de faire un autre contrôle:
def is_nan(x):
return isinstance(x, float) and math.isnan(x)
Avec python <2.6 j'ai fini avec
def isNaN(x):
return str(float(x)).lower() == 'nan'
Cela fonctionne pour moi avec Python 2.5.1 sur une boîte Solaris 5.9 et avec Python 2.6.5 sur Ubuntu 10.
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)}")
Sortie
It's pd.isna : True
It's np.isnan : True
It's math.isnan : True
Toutes les méthodes pour dire si la variable est NaN ou None:
Aucun type
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()
Type 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
Je reçois les données d'un service Web qui envoie NaN
sous la forme d'une chaîne 'Nan'
. Mais il pourrait également y avoir d'autres types de chaînes dans mes données, donc un simple float(value)
pourrait lever une exception. J'ai utilisé la variante suivante de la réponse acceptée:
def isnan(value):
try:
import math
return math.isnan(float(value))
except:
return False
Exigence:
isnan('hello') == False
isnan('NaN') == True
isnan(100) == False
isnan(float('nan')) = True
Pour nan de type 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
Si vous avez des types mixtes dans un itérable, voici une solution qui n'utilise pas 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
)]
isnan
ne sera pas appelé sur des valeurs qui ne sont pas de type 'float' car (False and …
est rapidement évalué àFalse
sans qu'il soit nécessaire d'évaluer le côté droit.