it-swarm.com.de

Wie kann ich nach NaN-Werten suchen?

float('nan') führt zu Nan (keine Zahl). Aber wie überprüfe ich das? Sollte sehr einfach sein, aber ich kann es nicht finden.

678
Jack Ha

math.isnan ()

Prüft, ob der Float x eine NaN (keine Zahl) ist. NaNs sind Teil der IEEE 754-Standards. Eine Operation wie inf * 0, inf/inf oder jede Operation, die ein NaN beinhaltet, z. nan * 1, geben Sie ein NaN zurück.

Neu in Version 2.6.

>>> import math
>>> x=float('nan')
>>> math.isnan(x)
True
>>> 
889
gimel

Der übliche Weg, um ein NaN zu testen, ist zu sehen, ob es sich selbst gleich ist:

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

numpy.isnan(number) sagt Ihnen, ob es in Python 2.5 NaN ist oder nicht.

106
mavnn

Ich bin eigentlich nur darauf gestoßen, aber für mich wurde nach nan, -inf oder inf gesucht. Ich habe gerade gebraucht

if float('-inf') < float(num) < float('inf'):

Dies gilt für Zahlen, falsch für nan und beide inf und führt zu einer Ausnahme für Zeichenfolgen oder andere Arten (was wahrscheinlich eine gute Sache ist). Außerdem müssen keine Bibliotheken wie math oder numpy importiert werden (numpy ist so verdammt groß, dass die Größe einer kompilierten Anwendung verdoppelt wird).

23

math.isnan ()

oder vergleichen Sie die Nummer mit sich selbst. NaN ist immer! = NaN, andernfalls (z. B. wenn es eine Zahl ist ) sollte der Vergleich erfolgreich sein.

21
Tomalak

hier ist eine Antwort mit:

  • python nicht eindeutig NaN: float('nan')
  • numpy unique NaN (Singleton): np.nan
  • alle anderen Objekte: Zeichenfolge oder was auch immer (löst keine Ausnahmen aus, wenn sie gefunden werden)

Hier ist es:

import numpy as np

def is_nan(x):
    return (x is np.nan or x != x)

Und einige Beispiele:

values = [float('nan'), np.nan, 55, "string", lambda x : x]
for value in values:
    print "{:<8} : {}".format(repr(value), is_nan(value))

Ausgabe:

nan      : True
nan      : True
55       : False
'string' : False
<function <lambda> at 0x000000000927BF28> : False
18
x0s

Eine andere Methode, wenn Sie bei <2.6 nicht weiterkommen, keine Nummer haben und keine IEEE 754-Unterstützung haben:

def isNaN(x):
    return str(x) == str(1e400*0)
14
Josh Lee

Nun, ich habe diesen Beitrag eingegeben, weil ich Probleme mit der Funktion hatte:

math.isnan()

Es gibt ein Problem, wenn Sie diesen Code ausführen:

a = "hello"
math.isnan(a)

Es löst die Ausnahme ..__ aus. Meine Lösung dafür ist eine weitere Prüfung:

def is_nan(x):
    return isinstance(x, float) and math.isnan(x)
8
Idok

Mit Python <2.6 endete ich mit

def isNaN(x):
    return str(float(x)).lower() == 'nan'

Dies funktioniert für mich mit Python 2.5.1 unter einer Solaris 5.9-Box und mit Python 2.6.5 unter Ubuntu 10 

7
Mauro Bianchi

Hier sind drei Möglichkeiten, wie Sie testen können, ob eine Variable "NaN" ist oder nicht.

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)}")

Ausgabe

It's pd.isna  : True
It's np.isnan  : True
It's math.isnan  : True
7
M. Hamza Rajput

Alle Methoden, um festzustellen, ob die Variable NaN oder None ist:

Keine Art

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

NaN-Typ

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

Ich erhalte die Daten von einem Webdienst, der NaN als Zeichenfolge 'Nan' sendet. Es gibt jedoch auch andere Arten von Zeichenfolgen in meinen Daten, sodass eine einfache float(value) eine Ausnahme auslösen kann. Ich habe die folgende Variante der akzeptierten Antwort verwendet:

def isnan(value):
  try:
      import math
      return math.isnan(float(value))
  except:
      return False

Anforderung:

isnan('hello') == False
isnan('NaN') == True
isnan(100) == False
isnan(float('nan')) = True
2
Mahdi

Für nan vom Typ 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

So entfernen Sie NaN (Float) -Elemente aus einer Liste gemischter Datentypen

Wenn Sie gemischte Typen in einem iterierbaren Element haben, finden Sie hier eine Lösung, die kein numpy verwendet:

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 nicht für Werte aufgerufen wird, die nicht vom Typ 'float' sind, da (False and … schnell zu False ausgewertet wird, ohne die rechte Seite auszuwerten.

0
sleblanc