Problem

Man ist in einem Projekt, es wird Python eingesetzt, Daten müssen verarbeitet werden, einzelne Zahlen fehlen, die logischerweise durch ein NaN (“Not a Number”) ersetzt werden. Auf einmal stellt man fest, dass alles kompletter Wahnsinn ist. Schaut man sich das Ganze in Python ein bisschen genauer an, wird es sogar noch schlimmer als eigentlich gedacht.

Es gibt drei verschiedene Methoden, um mit Python ein NaN direkt zu erzeugen: numpy.nan, math.nan und float('nan').

Dass in Python nan != nan ist laut IEEE Standard so definiert. Doch auch bei dem Vergleich mit dem is-Operator, verhalten sich NaNs seltsam:

INPUT
numpy.nan is numpy.nan            
math.nan is math.nan              
math.nan is numpy.nan        
float('nan') is math.nan   
float('nan') is numpy.nan      
float('nan') is float('nan')
OUTPUT
True    # klar
True    # hab ich so erwartet
False   # hmm, ok interessant
False   # ja, ok
False   # na gut
False   # What the NaN?

Noch seltsamer wird es, wenn man ein Set aus einer Liste oder einem Array bildet, in der mehr als ein float('nan') enthalten ist. Dann wundert man sich schnell, warum mehr als ein NaN im Ergebnis steckt.

INPUT
set([numpy.nan, numpy.nan, 0, 1, 2])
set([float('nan'), float('nan'), 0, 1, 2])
set(numpy.array([numpy.nan, numpy.nan]))
OUTPUT
{nan, 0, 2, 1}
{nan, nan, 2, 0, 1}
{nan, nan}

Lösung

Um zuverlässig bestimmen zu können, ob eine Variable ein NaN enthält, gibt es unterschiedliche Methoden. Numpy, math und auch pandas bieten z. B. jeweils eine Methode zur NaN-Überprüfungen an. Es ist auch möglich die Variable mit dem equals-Operator mit sich selbst zu vergleichen. Um ein korrektes Set aus einer Liste oder einem Array zu generieren, ist etwas mehr Kreativität notwendig.

Beispiel

INPUT
x = float('nan')
numpy.isnan(x)
x != x
 
y = [numpy.nan, math.nan, 0, 2, 1]
set(y)
{x if x == x else numpy.nan for x in y}
OUTPUT
nan
True
True  
 
[nan, nan, 0, 2, 1]
{nan, nan, 2, 0, 1}
{nan, 0, 2, 1}
Visual jambit ToiletPaper 170 What the NaN

Weitere Aspekte

---

Autorin: Vera Müller

SCHREIB UNS

* Pflichtfeld

SCHREIB UNS

* Pflichtfeld

Cookie-Einstellungen

Diese Website verwendet Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und Zugriffe auf die Website zu analysieren. Zudem werden Informationen zu Ihrer Verwendung der Website an Partner für soziale Medien, Werbung und Analysen weitergegeben. Die Partner führen diese Informationen möglicherweise mit weiteren Daten zusammen, die Sie ihnen bereitgestellt haben oder die sie im Rahmen Ihrer Nutzung der Dienste gesammelt haben.

Weitere Informationen finden Sie in unserer Datenschutzerklärung. Dort können Sie nachträglich auch Ihre Cookie-Einstellungen ändern.

contact icon

Kontakt aufnehmen