web-dev-qa-db-fra.com

Comment puis-je vérifier les valeurs NaN?

float('nan') donne Nan (pas un nombre). Mais comment puis-je vérifier? Devrait être très facile, mais je ne le trouve pas.

678
Jack Ha

math.isnan ()

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
>>> 
889
gimel

Le moyen habituel de tester un NaN est de voir s'il est égal à lui-même:

def isNaN(num):
    return num != num
262

numpy.isnan(number) vous indique s'il s'agit de NaN ou non dans Python 2.5.

106
mavnn

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).

23
DaveTheScientist

math.isnan ()

ou comparer le nombre à lui-même. NaN est toujours! = NaN, sinon (par exemple, si est un nombre), la comparaison devrait aboutir.

19
Tomalak

voici une réponse avec:

  • python non unique NaN: float('nan')
  • numpy unique NaN (singleton): np.nan
  • tout autre objet: chaîne ou autre (ne génère pas d'exception si elle est rencontrée)

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
18
x0s

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)
14
Josh Lee

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)
8
Idok

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. 

7
Mauro Bianchi

Voici trois manières de tester une variable "NaN" ou non.

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
7
M. Hamza Rajput

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
2
siberiawolf61

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
2
Mahdi

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
0
Justin

Comment supprimer des éléments NaN (float) d'une liste de types de données mélangés

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.

0
sleblanc