Ich lese Daten aus einer CSV-Datei in einen Pandas-Datenrahmen wie folgt. Für eine der Spalten id
möchte ich nämlich den Spaltentyp als angeben int
. Das Problem ist, dass die id
Serie fehlende / leere Werte hat.
Wenn ich versuche, die id
Spalte beim Lesen der CSV-Datei in eine Ganzzahl umzuwandeln, wird Folgendes angezeigt:
df= pd.read_csv("data.csv", dtype={'id': int})
error: Integer column has NA values
Alternativ habe ich versucht, den Spaltentyp nach dem Lesen wie folgt zu konvertieren, aber diesmal erhalte ich:
df= pd.read_csv("data.csv")
df[['id']] = df[['id']].astype(int)
error: Cannot convert NA to integer
Wie kann ich das angehen?
Antworten:
Das Fehlen von NaN rep in ganzzahligen Spalten ist ein Pandas "Gotcha" .
Die übliche Problemumgehung besteht darin, einfach Floats zu verwenden.
quelle
df = df.astype(pd.Int32Dtype())
(um den gesamten Datenrahmen zu konvertieren, oder)df['col'] = df['col'].astype(pd.Int32Dtype())
. Andere akzeptierte nullbare Ganzzahltypen sindpd.Int16Dtype
undpd.Int64Dtype
. Wähle dein Gift.In Version 0.24 hat + pandas die Fähigkeit erhalten, ganzzahlige d-Typen mit fehlenden Werten zu halten.
Nullable Integer Datentyp .
Pandas können mit ganzzahligen Daten mit möglicherweise fehlenden Werten darstellen
arrays.IntegerArray
. Dies ist ein Erweiterungstyp, der in Pandas implementiert ist. Es ist nicht der Standard-D-Typ für Ganzzahlen und wird nicht abgeleitet. Sie müssen den dtype explizit anarray()
oder übergebenSeries
:Verwenden Sie zum Konvertieren von Spalten in nullfähige Ganzzahlen:
quelle
"Int64"
und nicht"int64"
(zuerst muss 'i' großgeschrieben werden )df.myCol = df.myCol.astype('Int64')
oderdf['myCol'] = df['myCol'].astype('Int64')
Mein Anwendungsfall ist das Munging von Daten vor dem Laden in eine DB-Tabelle:
Entfernen Sie NaNs, konvertieren Sie sie in int, konvertieren Sie sie in str und fügen Sie NANs erneut ein.
Es ist nicht schön, aber es erledigt den Job!
quelle
Es ist jetzt möglich, eine Pandas-Spalte zu erstellen, die NaNs als dtype enthält
int
, da sie jetzt offiziell zu pandas 0.24.0 hinzugefügt wirdVersionshinweise zu pandas 0.24.x Zitat: " Pandas hat die Fähigkeit erlangt, ganzzahlige d-Typen mit fehlenden Werten zu halten
quelle
Wenn Sie unbedingt Ganzzahlen und NaNs in einer Spalte kombinieren möchten, können Sie den Datentyp 'Objekt' verwenden:
Dadurch werden NaNs durch eine Ganzzahl ersetzt (egal welche), in int konvertiert, in Objekt konvertiert und schließlich NaNs erneut eingefügt.
quelle
Wenn Sie Ihre gespeicherten Daten ändern können, verwenden Sie einen Sentinel-Wert für das Fehlen
id
. Ein häufiger Anwendungsfall, der durch den Spaltennamen abgeleitet wird,id
ist eine Ganzzahl, die streng größer als Null ist. Sie können sie0
als Sentinel-Wert verwenden, damit Sie schreiben könnenquelle
Sie können verwenden,
.dropna()
wenn es in Ordnung ist, die Zeilen mit den NaN-Werten zu löschen.Alternativ können Sie das NaN verwenden
.fillna()
und.astype()
durch Werte ersetzen und diese in int konvertieren.Ich bin auf dieses Problem gestoßen, als ich eine CSV-Datei mit großen Ganzzahlen verarbeitet habe, während einige davon fehlten (NaN). Die Verwendung von float als Typ war keine Option, da ich möglicherweise die Genauigkeit verlieren würde.
Meine Lösung bestand darin , str als Zwischentyp zu verwenden . Dann können Sie die Zeichenfolge später im Code nach Belieben in int konvertieren. Ich habe NaN durch 0 ersetzt, aber Sie können einen beliebigen Wert auswählen.
Zur Veranschaulichung ist hier ein Beispiel, wie Schwimmer die Präzision verlieren können:
Und die Ausgabe ist:
quelle
Die meisten Lösungen hier zeigen Ihnen, wie Sie eine Platzhalter-Ganzzahl verwenden, um Nullen darzustellen. Dieser Ansatz ist nicht hilfreich, wenn Sie sich nicht sicher sind, ob in Ihren Quelldaten keine Ganzzahl angezeigt wird. Meine Methode mit will formatiert Floats ohne ihre Dezimalwerte und konvertiert Nullen in Keine. Das Ergebnis ist ein Objektdatentyp, der beim Laden in eine CSV wie ein ganzzahliges Feld mit Nullwerten aussieht.
quelle
Ich bin auf dieses Problem gestoßen, als ich mit pyspark gearbeitet habe. Da dies ein Python-Frontend für Code ist, der auf einem JVM ausgeführt wird, ist Typensicherheit erforderlich, und die Verwendung von float anstelle von int ist keine Option. Ich habe das Problem umgangen, indem ich die Pandas
pd.read_csv
in eine Funktion eingeschlossen habe, die benutzerdefinierte Spalten mit benutzerdefinierten Füllwerten füllt, bevor sie in den erforderlichen Typ umgewandelt werden. Folgendes habe ich letztendlich verwendet:quelle
Entfernen Sie zuerst die Zeilen, die NaN enthalten. Führen Sie dann eine Ganzzahlkonvertierung für die verbleibenden Zeilen durch. Zuletzt die entfernten Zeilen wieder einfügen. Hoffe es wird funktionieren
quelle
quelle
edit
zusätzliche Informationen hinzufügen und / oder Ihre Erklärungen durch Quellendokumentation ergänzen.Angenommen, Ihre mit DateColumn formatierte 3312018.0 sollte als Zeichenfolge in den 31.03.2008 konvertiert werden. Und einige Datensätze fehlen oder 0.
quelle