float('nan')
steht für NaN (not a number). Aber wie kann ich das überprüfen?
Dies ist nicht allzu portabel, da Windows dies manchmal als -1.#IND
float('nan')
steht für NaN (not a number). Aber wie kann ich das überprüfen?
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])
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
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.
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.
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 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.
31 Stimmen
Zur Geschichte von NaN in Python, siehe PEP 754. python.org/dev/peps/pep-0754