float('nan')
führt zu Nan (keine Zahl). Aber wie überprüfe ich das? Sollte sehr einfach sein, aber ich kann es nicht finden.
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
>>>
Der übliche Weg, um ein NaN zu testen, ist zu sehen, ob es sich selbst gleich ist:
def isNaN(num):
return num != num
numpy.isnan(number)
sagt Ihnen, ob es in Python 2.5 NaN
ist oder nicht.
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).
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.
hier ist eine Antwort mit:
float('nan')
np.nan
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
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)
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)
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
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
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
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
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
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 zuFalse
ausgewertet wird, ohne die rechte Seite auszuwerten.