Ich lese zwei Spalten einer CSV-Datei mit Pandas readcsv() und weise die Werte dann einem Wörterbuch zu. Die Spalten enthalten Zeichenfolgen aus Zahlen und Buchstaben. Gelegentlich gibt es Fälle, in denen eine Zelle leer ist. Meiner Meinung nach sollte der zu diesem Wörterbucheintrag gelesene Wert None sein, aber stattdessen wird nan zugewiesen. Sicherlich beschreibt None eine leere Zelle besser, da sie einen Nullwert hat, während nan nur sagt, dass der gelesene Wert keine Zahl ist.

Ist mein Verständnis richtig, was ist der Unterschied zwischen None und nan? Warum wird nan anstelle von None zugewiesen?

Außerdem hat meine Wörterbuchprüfung auf leere Zellen numpy.isnan() verwendet:

for k, v in my_dict.iteritems():
    if np.isnan(v):

Dies gibt mir jedoch den Fehler, dass ich diese Prüfung nicht für v verwenden kann. Ich denke, das liegt daran, dass eine Ganzzahl- oder Float-Variable und keine Zeichenfolge verwendet werden soll. Wenn dies zutrifft, wie kann ich v auf einen Fall "leere Zelle" / nan prüfen?

102
user1083734 8 Juli 2013 im 23:06

5 Antworten

Beste Antwort

NaN wird als Platzhalter für fehlende Daten konsequent bei Pandas ist die Konsistenz gut. Normalerweise lese / übersetze ich NaN als "vermisst" . Siehe auch den Abschnitt "Arbeiten mit fehlenden Daten" in den Dokumenten.

Wes schreibt in den Dokumenten Wahl der NA-Darstellung ':

Nach Jahren der Produktion hat sich [NaN] zumindest meiner Meinung nach angesichts der Situation in NumPy und Python im Allgemeinen als die beste Entscheidung erwiesen. Der spezielle Wert NaN (Not-A-Number) wird überall als NA-Wert verwendet, und es gibt API-Funktionen isnull und notnull, das über die d-Typen hinweg verwendet werden kann, um NA-Werte zu erkennen.
...
Daher habe ich den pythonischen Ansatz "Praktikabilität schlägt Reinheit" gewählt und die Fähigkeit zur Ganzzahl-NA gehandelt, um einen viel einfacheren Ansatz zu verwenden, einen speziellen Wert in Float- und Objekt-Arrays zur Bezeichnung von NA zu verwenden und Ganzzahl-Arrays zum Floating zu befördern, wenn NAs eingeführt werden müssen.

Hinweis: Die "gotcha" dieser Ganzzahl Serien mit fehlenden Daten werden auf Floats übertragen.

Meiner Meinung nach ist der Hauptgrund für die Verwendung von NaN (über None), dass es mit dem float64-Typ von numpy und nicht mit dem weniger effizienten Objekt-Typ gespeichert werden kann, siehe Aktionen vom Typ NA .

#  without forcing dtype it changes None to NaN!
s_bad = pd.Series([1, None], dtype=object)
s_good = pd.Series([1, np.nan])

In [13]: s_bad.dtype
Out[13]: dtype('O')

In [14]: s_good.dtype
Out[14]: dtype('float64')

Jeff kommentiert (unten) dies:

np.nan ermöglicht vektorisierte Operationen; Es ist ein Float-Wert, während None per Definition den Objekttyp erzwingt, wodurch im Grunde alle Effizienz in Numpy deaktiviert wird.

Wiederholen Sie dies also dreimal schnell: object == bad, float == good

Davon abgesehen funktionieren viele Vorgänge möglicherweise immer noch genauso gut mit None vs NaN (werden jedoch möglicherweise nicht unterstützt, dh sie liefern manchmal überraschende Ergebnisse):

In [15]: s_bad.sum()
Out[15]: 1

In [16]: s_good.sum()
Out[16]: 1.0

Um die zweite Frage zu beantworten:
Sie sollten pd.isnull und pd.notnull um auf fehlende Daten (NaN) zu testen.

98
JiminyCricket 22 Nov. 2017 im 18:10

Nachfolgend sind die Unterschiede aufgeführt:

  • nan gehört zur Klasse float
  • None gehört zur Klasse NoneType

Ich fand den folgenden Artikel sehr hilfreich: https: // medium. com / analyse-vidhya / Umgang mit fehlenden Werten-nan-und-keine-in-Python-6fc9b8fb4f31

-1
calestini 18 Jän. 2020 im 21:02

NaN steht für NICHT eine Zahl .
None könnte für jedes stehen.

-3
diegoaguilar 8 Juli 2013 im 19:09

NaN kann als numerischer Wert für mathematische Operationen verwendet werden, während None dies nicht kann (oder zumindest nicht sollte).

NaN ist ein numerischer Wert, wie in IEEE 754-Gleitkomma-Standard definiert. None ist eine interne Python-Tabelle (NoneType) und würde in diesem Zusammenhang eher "nicht vorhanden" oder "leer" als "numerisch ungültig" sein.

Das Hauptsymptom dafür ist, dass Sie NaN erhalten, wenn Sie beispielsweise einen Durchschnitt oder eine Summe für ein Array ausführen, das NaN enthält, sogar ein einzelnes ...

Andererseits können Sie keine mathematischen Operationen mit None als Operanden ausführen.

Je nach Fall können Sie also None verwenden, um Ihren Algorithmus anzuweisen, ungültige oder nicht vorhandene Werte bei Berechnungen nicht zu berücksichtigen. Das würde bedeuten, dass der Algorithmus jeden Wert testen sollte, um festzustellen, ob er None ist.

Numpy hat einige Funktionen, um NaN-Werte zu vermeiden, die Ihre Ergebnisse verunreinigen, wie z. B. nansum und nan_to_num.

16
heltonbiker 8 Juli 2013 im 19:16

Die Funktion isnan() prüft, ob etwas vorhanden ist "Not A Number" und gibt zurück, ob eine Variable eine Zahl ist oder nicht, zum Beispiel würde isnan(2) false zurückgeben

Die Bedingung myVar is not None gibt zurück, ob die Variable definiert ist oder nicht

Ihr numpy-Array verwendet isnan(), da es ein Array von Zahlen sein soll und alle Elemente des Arrays auf NaN initialisiert. Diese Elemente werden als "leer" betrachtet.

3
Stephan 10 Juli 2013 im 16:05