Antworten:
Geben Sie zurück,
True
wenn x ein NaN (keine Zahl) ist, undFalse
ansonsten.
>>> import math
>>> x = float('nan')
>>> math.isnan(x)
True
math.isnan
bevorzugt zu np.isnan()
?
import numpy
benötigt etwa 15 MB RAM, während import math
etwa 0,2 MB
numpy.isnan
ist dies eine überlegene Wahl, da es NumPy-Arrays verarbeitet. Wenn Sie nicht NumPy verwenden, gibt es keinen Vorteil eine NumPy Abhängigkeit zu nehmen und verbringen die Zeit NumPy nur für eine NaN Scheck zu laden (aber wenn Sie die Art von Code schreiben , die NaN Kontrollen der Fall ist, ist es wahrscheinlich , dass Sie sollten verwenden NumPy).
Der übliche Weg, um auf ein NaN zu testen, besteht darin, festzustellen, ob es sich selbst entspricht:
def isNaN(num):
return num != num
numpy.isnan(number)
sagt dir, ob es ist NaN
oder nicht.
numpy.all(numpy.isnan(data_list))
ist auch nützlich, wenn Sie feststellen müssen, ob alle Elemente in der Liste nan sind
all(map(math.isnan, [float("nan")]*5))
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
ps.isna()
löst meine Probleme. Vielen Dank!
Hier ist eine Antwort, mit der gearbeitet wird:
float('nan')
, numpy.nan
...Ein nach dem Standard implementiertes NaN ist der einzige Wert, für den der Ungleichheitsvergleich mit sich selbst True zurückgeben sollte:
def is_nan(x):
return (x != x)
Und einige Beispiele:
import numpy as np
values = [float('nan'), np.nan, 55, "string", lambda x : x]
for value in values:
print(f"{repr(value):<8} : {is_nan(value)}")
Ausgabe:
nan : True
nan : True
55 : False
'string' : False
<function <lambda> at 0x000000000927BF28> : False
numpy.nan
ist ein reguläres Python- float
Objekt, genau wie die von float('nan')
. Die meisten NaNs, denen Sie in NumPy begegnen, sind nicht das numpy.nan
Objekt.
numpy.nan
definiert seinen NaN Wert auf seinem eigenen in der zugrunde liegenden Bibliothek in C . Pythons NaN wird nicht verpackt. Jetzt entsprechen beide dem IEEE 754-Standard, da sie auf der C99-API basieren.
float('nan') is float('nan')
(nicht eindeutig) und np.nan is np.nan
(eindeutig)
np.nan
ist ein bestimmtes Objekt, während jeder float('nan')
Aufruf ein neues Objekt erzeugt. Wenn du das getan nan = float('nan')
hättest, würdest du es auch bekommen nan is nan
. Wenn Sie einen konstruierten tatsächlichen NumPy NaN mit so etwas wie np.float64('nan')
, dann würden Sie bekommen np.float64('nan') is not np.float64('nan')
auch .
Ich bin eigentlich nur darauf gestoßen, aber für mich war es die Suche nach nan, -inf oder inf. Ich habe es gerade benutzt
if float('-inf') < float(num) < float('inf'):
Dies gilt für Zahlen, falsch für nan und beide inf und löst eine Ausnahme für Dinge wie Strings oder andere Typen aus (was wahrscheinlich eine gute Sache ist). Außerdem müssen keine Bibliotheken wie math oder numpy importiert werden (numpy ist so verdammt groß, dass sich die Größe einer kompilierten Anwendung verdoppelt).
math.isfinite
wurde erst mit Python 3.2 eingeführt. Angesichts der Antwort von @DaveTheScientist aus dem Jahr 2012 war es nicht gerade "das Rad neu erfinden" - die Lösung steht immer noch für diejenigen, die mit Python 2 arbeiten.
oder vergleichen Sie die Nummer mit sich selbst. NaN ist immer! = NaN, andernfalls (z. B. wenn es sich um eine Zahl handelt) sollte der Vergleich erfolgreich sein.
Nun, ich habe diesen Beitrag eingegeben, weil ich einige Probleme mit der Funktion hatte:
math.isnan()
Beim Ausführen dieses Codes tritt ein Problem auf:
a = "hello"
math.isnan(a)
Es wird eine Ausnahme ausgelöst. Meine Lösung dafür ist eine weitere Überprüfung:
def is_nan(x):
return isinstance(x, float) and math.isnan(x)
def is_nan(x): try: return math.isnan(x) except: return False
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 auf einer Solaris 5.9-Box und mit Python 2.6.5 unter Ubuntu 10
-1.#IND
Ich empfange die Daten von einem Webdienst, der NaN
als Zeichenfolge sendet 'Nan'
. Aber es könnte auch andere Arten von Zeichenfolgen in meinen Daten geben, 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
Anforderung:
isnan('hello') == False
isnan('NaN') == True
isnan(100) == False
isnan(float('nan')) = True
try: int(value)
value
Sein NaN
oder Nicht- Sein aus ?
NaN
(wie in Python, woraus man kommen könnte float('inf') * 0
), und daher ist die Zeichenfolge 'Hallo' zwar keine Zahl, aber auch nicht, NaN
weil sie NaN
immer noch ein numerischer Wert ist!
int(value)
Für alle Ausnahmen False
wird geschrieben.
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
Wenn Sie gemischte Typen in einer Iterable haben, ist hier eine Lösung, die numpy nicht 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
Werte, die nicht vom Typ 'float' sind, nicht aufgerufen werden, da sie False and (…)
schnell ausgewertet werden, False
ohne dass die rechte Seite ausgewertet werden muss.
In Python 3.6 löst das Überprüfen eines Zeichenfolgenwerts x math.isnan (x) und np.isnan (x) einen Fehler aus. Ich kann also nicht überprüfen, ob der angegebene Wert NaN ist oder nicht, wenn ich vorher nicht weiß, dass es sich um eine Zahl handelt. Das Folgende scheint dieses Problem zu lösen
if str(x)=='nan' and type(x)!='str':
print ('NaN')
else:
print ('non NaN')
Es scheint, dass zu überprüfen, ob es sich selbst gleich ist
x!=x
ist der schnellste.
import pandas as pd
import numpy as np
import math
x = float('nan')
%timeit x!=x
44.8 ns ± 0.152 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%timeit math.isnan(x)
94.2 ns ± 0.955 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%timeit pd.isna(x)
281 ns ± 5.48 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit np.isnan(x)
1.38 µs ± 15.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
für Strings in Panda nimm pd.isnull:
if not pd.isnull(atext):
for word in nltk.word_tokenize(atext):
die Funktion als Merkmalsextraktion für NLTK
def act_features(atext):
features = {}
if not pd.isnull(atext):
for word in nltk.word_tokenize(atext):
if word not in default_stopwords:
features['cont({})'.format(word.lower())]=True
return features