1664 Stimmen

Wie kann ich auf NaN-Werte prüfen?

float('nan') steht für NaN (not a number). Aber wie kann ich das überprüfen?

31 Stimmen

Zur Geschichte von NaN in Python, siehe PEP 754. python.org/dev/peps/pep-0754

10voto

Erfan Punkte 36580

Vergleich pd.isna , math.isnan y np.isnan und ihre Flexibilität im Umgang mit verschiedenen Arten von Objekten.

Die nachstehende Tabelle zeigt, ob die Art des Objekts mit der angegebenen Methode überprüft werden kann:

+------------+-----+---------+------+--------+------+
|   Method   | NaN | numeric | None | string | list |
+------------+-----+---------+------+--------+------+
| pd.isna    | yes | yes     | yes  | yes    | yes  |
| math.isnan | yes | yes     | no   | no     | no   |
| np.isnan   | yes | yes     | no   | no     | yes  | <-- # will error on mixed type list
+------------+-----+---------+------+--------+------+

pd.isna

Die flexibelste Methode, um auf verschiedene Arten von fehlenden Werten zu prüfen.


Keine der Antworten bezieht sich auf die Flexibilität der pd.isna . Während math.isnan y np.isnan wird zurückgegeben True für NaN Werte, können Sie nicht nach anderen Objekttypen suchen wie None oder Saiten. Beide Methoden geben einen Fehler zurück, so dass die Überprüfung einer Liste mit gemischten Typen umständlich ist. Dieses während pd.isna ist flexibel und gibt den richtigen Booleschen Wert für verschiedene Arten von Typen zurück:

In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: missing_values = [3, None, np.NaN, pd.NA, pd.NaT, '10']

In [4]: pd.isna(missing_values)
Out[4]: array([False,  True,  True,  True,  True, False])

10voto

Mauro Bianchi Punkte 665

Mit Python < 2.6 landete ich bei

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

Dies funktioniert bei mir mit Python 2.5.1 auf einem Solaris 5.9 Rechner und mit Python 2.6.5 auf Ubuntu 10

6 Stimmen

Dies ist nicht allzu portabel, da Windows dies manchmal als -1.#IND

7voto

Mahdi Punkte 1728

Ich empfange die Daten von einem Webdienst, der Folgendes sendet NaN als Zeichenkette 'Nan' . Es könnten aber auch andere Arten von Zeichenfolgen in meinen Daten vorkommen, so dass eine einfache float(value) eine Ausnahme auslösen könnte. Ich habe die folgende Variante der akzeptierten Antwort verwendet:

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

Erfordernis:

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

1 Stimmen

Oder try: int(value)

0 Stimmen

@chwi, was sagt Ihr Vorschlag über value unter NaN oder nicht?

0 Stimmen

Nun, als "nicht eine Zahl", alles, was nicht zu einem int gecastet werden kann ich denke, ist in der Tat nicht eine Zahl, und die Try-Anweisung wird fehlschlagen? Try, return true, except return false.

4voto

sleblanc Punkte 3733

Entfernen von NaN-Elementen (Float) aus einer Liste gemischter Datentypen

Wenn Sie gemischte Typen in einer Iterable haben, ist hier eine Lösung, die nicht 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
                      )]

\['a', 'b', 'd', 1.1024\]

Kurzschlussauswertung bedeutet, dass isnan wird nicht für Werte aufgerufen, die nicht vom Typ 'float' sind, da False and (…) wertet schnell zu False ohne die rechte Seite auswerten zu müssen.

4voto

siberiawolf61 Punkte 59

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

Kein Typ

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X