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 Wert, der zu diesem Wörterbucheintrag gelesen wird, None
aber stattdessen nan
zugewiesen werden. Sicherlich None
ist eine leere Zelle aussagekräftiger, da sie einen Nullwert hat, während nan
nur gesagt wird, dass der gelesene Wert keine Zahl ist.
Ist mein Verständnis richtig, was ist der Unterschied zwischen None
und nan
? Warum wird statt nan
zugewiesen None
?
Außerdem hat meine Wörterbuchprüfung für leere Zellen Folgendes verwendet numpy.isnan()
:
for k, v in my_dict.iteritems():
if np.isnan(v):
Dies gibt mir jedoch einen Fehler, der besagt, dass ich diese Prüfung nicht verwenden kann v
. Ich denke, das liegt daran, dass eine Ganzzahl- oder Float-Variable und keine Zeichenfolge verwendet werden soll. Wenn dies zutrifft, wie kann ich v
nach einer "leeren Zelle" / einem "leeren nan
Fall " suchen?
qwerty
ist keine Zahl.None
wäre sicherlich eine bessere Beschreibung des Wertes einer leeren Zelle.Antworten:
NaN wird als Platzhalter verwendet für fehlende Daten konsistent in 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' :
Hinweis: Die "gotcha", die Ganzzahlserien mit fehlenden Daten enthalten, werden in Floats übertragen .
Meiner Meinung nach ist der Hauptgrund für die Verwendung von NaN (über None), dass es mit dem Float64-D-Typ von numpy und nicht mit dem weniger effizienten Objekt-D- Typ gespeichert werden kann ( siehe NA-Typ-Promotions) .
Jeff kommentiert (unten) dies:
Wenn man so sagt, funktionieren viele Operationen möglicherweise immer noch genauso gut mit None vs NaN (werden aber möglicherweise nicht unterstützt, dh sie liefern manchmal überraschende Ergebnisse ):
Um die zweite Frage zu beantworten:
Sie sollten fehlende Daten (NaN) verwenden
pd.isnull
undpd.notnull
auf diese testen.quelle
np.nan
ermöglicht vektorisierte Operationen; Es ist ein Float-Wert, während erNone
per Definition denobject
Typ erzwingt und im Grunde alle Effizienz in Numpy deaktiviert. Wiederholen Sie ihn also dreimal schnell:object==bad, float==good
<NA>
auch einnp.nan
?NaN
kann als numerischer Wert für mathematische Operationen verwendet werden,None
kann (oder sollte zumindest nicht).NaN
ist ein numerischer Wert, wie er im Gleitkomma-Standard IEEE 754 definiert ist .None
ist ein interner Python-Typ (NoneType
) und wäre in diesem Zusammenhang eher "nicht vorhanden" oder "leer" als "numerisch ungültig".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 ausführen, die
None
als Operanden verwendet werden.Je nach Fall können Sie
None
Ihrem Algorithmus also mitteilen, dass bei Berechnungen keine ungültigen oder nicht vorhandenen Werte berücksichtigt werden sollen. Das würde bedeuten, dass der Algorithmus jeden Wert testen sollte, um festzustellen, ob dies der Fall istNone
.Numpy hat einige Funktionen NaN - Werte zu vermeiden , dass Ihre Ergebnisse, wie zu verunreinigen
nansum
undnan_to_num
zum Beispiel.quelle
df=pd.readcsv('file.csv')
es mirNaN
Werte für die leeren Zellen und nichtNone
? Soweit mir bekannt ist, sind pd.DataFrames nicht ausschließlich für Zahlen.dtype
, daher müssen ungültige Werte vondtype=float
durch numerische Werte dargestellt werden, dieNaN
ist undNone
nicht ist (None
ist vonNoneType
).na
Argument, mit dem Sie entscheiden können, welchen Wert Sie verwendenDie Funktion
isnan()
prüft, ob etwas "Keine Zahl" ist, und gibt zurück, ob eine Variable eine Zahl ist oder nicht, z. B.isnan(2)
würde false zurückgegebenDie Bedingung gibt
myVar is not None
zurück, ob die Variable definiert ist oder nichtIhr numpy-Array wird verwendet,
isnan()
da es ein Array von Zahlen sein soll und alle Elemente des Arrays mitNaN
diesen Elementen initialisiert werden. Diese Elemente werden als "leer" betrachtet.quelle
isnan(2)
würde zurückkehrenFalse
, da 2 kein NaN ist.numpy.empty
wird nicht initialisiert Array - Werte zuNaN
. Die Werte werden einfach überhaupt nicht initialisiert.None
-ness istmyVar is not None
nichtmyVar != None
.np.isnan()
nicht für Zeichenfolgenvariablen implementiert ist. Wenn Sie also eine Zeichenfolge übergeben, stürzt diese ab. Besser zu verwenden,pd.isnull
was mit Strings funktioniert.Nachfolgend sind die Unterschiede aufgeführt:
nan
gehört zur Klassefloat
None
gehört zur KlasseNoneType
Ich fand den folgenden Artikel sehr hilfreich: https://medium.com/analytics-vidhya/dealing-with-missing-values-nan-and-none-in-python-6fc9b8fb4f31
quelle
NaN
stants für NICHT eine Zahl .None
könnte für jeden stehen .quelle