Ich möchte eine Tabelle, die als Liste von Listen dargestellt wird, in eine konvertieren Pandas DataFrame
. Als extrem vereinfachtes Beispiel:
a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a)
Was ist der beste Weg, um die Spalten in die entsprechenden Typen zu konvertieren, in diesem Fall die Spalten 2 und 3 in Gleitkommazahlen? Gibt es eine Möglichkeit, die Typen beim Konvertieren in DataFrame anzugeben? Oder ist es besser, zuerst den DataFrame zu erstellen und dann die Spalten zu durchlaufen, um den Typ für jede Spalte zu ändern? Idealerweise möchte ich dies auf dynamische Weise tun, da es Hunderte von Spalten geben kann und ich nicht genau angeben möchte, welche Spalten von welchem Typ sind. Ich kann nur garantieren, dass jede Spalte Werte des gleichen Typs enthält.
df.apply(pd.to_numeric, downcast="integer", errors="ignore")
Integer-Spalten auf den kleinsten (Integer-) D-Typ herabsetzen, der die Werte enthält.Antworten:
Sie haben drei Hauptoptionen zum Konvertieren von Typen in Pandas:
to_numeric()
- bietet Funktionen zum sicheren Konvertieren nicht numerischer Typen (z. B. Zeichenfolgen) in einen geeigneten numerischen Typ. (Siehe auchto_datetime()
undto_timedelta()
.)astype()
- (fast) jeden Typ in (fast) jeden anderen Typ konvertieren (auch wenn dies nicht unbedingt sinnvoll ist). Ermöglicht auch das Konvertieren in Kategorietypen (sehr nützlich).infer_objects()
- eine Dienstprogrammmethode zum Konvertieren von Objektspalten, die Python-Objekte enthalten, wenn möglich in einen Pandas-Typ.Lesen Sie weiter, um detailliertere Erklärungen und die Verwendung jeder dieser Methoden zu erhalten.
1.
to_numeric()
Der beste Weg, eine oder mehrere Spalten eines DataFrame in numerische Werte zu konvertieren, ist die Verwendung
pandas.to_numeric()
.Diese Funktion versucht, nicht numerische Objekte (z. B. Zeichenfolgen) nach Bedarf in Ganzzahlen oder Gleitkommazahlen umzuwandeln.
Grundlegende Verwendung
Die Eingabe in
to_numeric()
ist eine Serie oder eine einzelne Spalte eines DataFrame.Wie Sie sehen können, wird eine neue Serie zurückgegeben. Denken Sie daran, diese Ausgabe einem Variablen- oder Spaltennamen zuzuweisen, um sie weiterhin verwenden zu können:
Sie können es auch verwenden, um mehrere Spalten eines DataFrame über die folgende
apply()
Methode zu konvertieren :Solange Ihre Werte alle konvertiert werden können, ist das wahrscheinlich alles, was Sie brauchen.
Fehlerbehandlung
Was aber, wenn einige Werte nicht in einen numerischen Typ konvertiert werden können?
to_numeric()
Außerdem wird einerrors
Schlüsselwortargument verwendet, mit dem Sie nicht numerische Werte erzwingenNaN
oder Spalten mit diesen Werten einfach ignorieren können.Hier ist ein Beispiel mit einer Reihe von Zeichenfolgen
s
mit dem Objekt dtype:Das Standardverhalten ist das Erhöhen, wenn ein Wert nicht konvertiert werden kann. In diesem Fall kann es mit der Zeichenfolge 'pandas' nicht umgehen:
Anstatt zu scheitern, möchten wir vielleicht, dass 'Pandas' als fehlender / schlechter numerischer Wert betrachtet werden.
NaN
Mit demerrors
Schlüsselwortargument können wir ungültige Werte wie folgt erzwingen:Die dritte Option für
errors
besteht darin, die Operation zu ignorieren, wenn ein ungültiger Wert festgestellt wird:Diese letzte Option ist besonders nützlich, wenn Sie Ihren gesamten DataFrame konvertieren möchten, aber nicht wissen, welche unserer Spalten zuverlässig in einen numerischen Typ konvertiert werden können. In diesem Fall schreiben Sie einfach:
Die Funktion wird auf jede Spalte des DataFrame angewendet. Spalten, die in einen numerischen Typ konvertiert werden können, werden konvertiert, während Spalten, die dies nicht können (z. B. nichtstellige Zeichenfolgen oder Datumsangaben), in Ruhe gelassen werden.
Downcasting
Standardmäßig erhalten Sie bei der Konvertierung mit
to_numeric()
entweder einenint64
oder einen d-float64
Typ (oder eine beliebige ganzzahlige Breite, die für Ihre Plattform typisch ist).Das ist normalerweise das, was Sie wollen, aber was ist, wenn Sie etwas Speicherplatz sparen und einen kompakteren D-Typ verwenden möchten, wie
float32
oderint8
?to_numeric()
bietet Ihnen die Möglichkeit, entweder auf "Ganzzahl", "Vorzeichen", "Vorzeichen" oder "Float" herunterzuspielen. Hier ist ein Beispiel für eine einfache Reihes
von Ganzzahltypen:Beim Downcasting auf 'Ganzzahl' wird die kleinstmögliche Ganzzahl verwendet, die die Werte enthalten kann:
Beim Downcasting auf "Float" wird in ähnlicher Weise ein kleinerer als normaler Floating-Typ ausgewählt:
2.
astype()
Mit dieser
astype()
Methode können Sie explizit angeben, welchen D-Typ Ihr DataFrame oder Ihre Serie haben soll. Es ist sehr vielseitig, da Sie versuchen können, von einem Typ zum anderen zu wechseln.Grundlegende Verwendung
Wählen Sie einfach einen Typ aus: Sie können einen NumPy-Typ (z. B.
np.int16
), einige Python-Typen (z. B. bool) oder pandas-spezifische Typen (wie den kategorialen Typ) verwenden.Rufen Sie die Methode für das Objekt auf, das Sie konvertieren möchten, und
astype()
versuchen Sie, sie für Sie zu konvertieren :Beachten Sie, dass ich "try" gesagt habe. Wenn Sie
astype()
nicht wissen, wie ein Wert in der Serie oder im DataFrame konvertiert wird, wird ein Fehler ausgegeben. Wenn Sie beispielsweise einenNaN
oderinf
-Wert haben, wird beim Konvertieren in eine Ganzzahl eine Fehlermeldung angezeigt.Ab Pandas 0.20.0 kann dieser Fehler durch Bestehen unterdrückt werden
errors='ignore'
. Ihr ursprüngliches Objekt wird unberührt zurückgegeben.Achtung
astype()
ist mächtig, konvertiert aber manchmal Werte "falsch". Zum Beispiel:Dies sind kleine Ganzzahlen. Wie wäre es also mit einer Konvertierung in einen vorzeichenlosen 8-Bit-Typ, um Speicherplatz zu sparen?
Die Konvertierung funktionierte, aber die -7 wurde umwickelt, um 249 zu werden (dh 2 8 - 7)!
Der Versuch,
pd.to_numeric(s, downcast='unsigned')
stattdessen einen Downcast durchzuführen, kann diesen Fehler verhindern.3.
infer_objects()
In Version 0.21.0 von pandas wurde die Methode
infer_objects()
zum Konvertieren von Spalten eines DataFrame mit einem Objektdatentyp in einen spezifischeren Typ (Soft Conversions) eingeführt.Hier ist beispielsweise ein DataFrame mit zwei Spalten des Objekttyps. Eine enthält tatsächliche Ganzzahlen und die andere enthält Zeichenfolgen, die Ganzzahlen darstellen:
Mit
infer_objects()
können Sie den Typ der Spalte 'a' in int64 ändern:Die Spalte 'b' wurde in Ruhe gelassen, da ihre Werte Zeichenfolgen und keine Ganzzahlen waren. Wenn Sie versuchen möchten, die Konvertierung beider Spalten in einen Ganzzahltyp zu erzwingen, können Sie
df.astype(int)
stattdessen verwenden.quelle
.convert_objects
ist entstellt seit0.17
-df.to_numeric
stattdessen verwendenpd.to_numeric
seine Begleitmethoden im Gegensatz zu jeweils nur einer Spalte funktionierenconvert_objects
. Die Diskussion über eine Ersatzfunktion in der API scheint noch nicht abgeschlossen zu sein . Ich hoffe, dass eine Methode, die über den gesamten DataFrame funktioniert, erhalten bleibt, da sie sehr nützlich ist.int64
in sindint32
?astype
(wie in der anderen Antwort), dh.astype(numpy.int32)
.Wie wäre es damit?
quelle
pd.DataFrame
hat eindtype
Argument, mit dem Sie tun können, wonach Sie suchen. df = pd.DataFrame (a, Spalten = ['eins', 'zwei', 'drei'], dtype = float) In [2]: df.dtypes Out [2]: ein Objekt zwei float64 drei float64 dtype: ObjektSettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_index,col_indexer] = value instead
. Dies wurde möglicherweise in einer neueren Version von Pandas eingeführt, und ich sehe darin nichts Falsches, aber ich frage mich nur, worum es bei dieser Warnung geht. Irgendeine Idee?ValueError: Cannot convert NA to integer
df = pd.DataFrame(a, columns=['one', 'two', 'three'], dtype={'one': str, 'two': int, 'three': float})
. Es fällt mir jedoch schwer, die Spezifikation für akzeptierte "dtype" -Werte zu finden. Eine Liste wäre schön (derzeit mache ichdict(enumerate(my_list))
).Dieser folgende Code ändert den Datentyp der Spalte.
Anstelle des Datentyps können Sie Ihren Datentyp angeben. Was möchten Sie wie str, float, int usw.
quelle
bool
alles in geändert wirdTrue
.Wenn ich nur bestimmte Spalten angeben musste und explizit sein möchte, habe ich Folgendes verwendet (gemäß DOCS LOCATION ):
Verwenden Sie also die ursprüngliche Frage, geben Sie jedoch Spaltennamen an ...
quelle
Hier ist eine Funktion, die als Argumente einen DataFrame und eine Liste von Spalten verwendet und alle Daten in den Spalten zu Zahlen zwingt.
Also, für Ihr Beispiel:
quelle
Wie wäre es, zwei Datenrahmen mit jeweils unterschiedlichen Datentypen für ihre Spalten zu erstellen und diese dann zusammenzufügen?
Ergebnisse
Nachdem der Datenrahmen erstellt wurde, können Sie ihn in der ersten Spalte mit Gleitkommavariablen und in der zweiten Spalte mit Zeichenfolgen (oder einem beliebigen Datentyp) füllen.
quelle
Pandas> = 1,0
Hier ist eine Tabelle, die einige der wichtigsten Konvertierungen in Pandas zusammenfasst.
Konvertierungen in Zeichenfolgen sind trivial
.astype(str)
und in der Abbildung nicht dargestellt."Harte" versus "Weiche" Konvertierungen
Beachten Sie, dass "Konvertierungen" in diesem Zusammenhang entweder das Konvertieren von Textdaten in ihren tatsächlichen Datentyp (harte Konvertierung) oder das Ableiten geeigneterer Datentypen für Daten in Objektspalten (weiche Konvertierung) betreffen können. Schauen Sie sich das an, um den Unterschied zu veranschaulichen
quelle
Ich dachte, ich hätte das gleiche Problem, aber tatsächlich habe ich einen kleinen Unterschied, der die Lösung des Problems erleichtert. Für andere, die sich diese Frage ansehen, lohnt es sich, das Format Ihrer Eingabeliste zu überprüfen. In meinem Fall sind die Zahlen zunächst Floats und keine Strings wie in der Frage:
Wenn ich die Liste jedoch vor dem Erstellen des Datenrahmens zu stark verarbeite, verliere ich die Typen und alles wird zu einer Zeichenfolge.
Erstellen des Datenrahmens über ein Numpy-Array
gibt den gleichen Datenrahmen wie in der Frage an, wobei die Einträge in den Spalten 1 und 2 als Zeichenfolgen betrachtet werden. Jedoch tun
gibt tatsächlich einen Datenrahmen mit den Spalten im richtigen Format
quelle
Ab Pandas 1.0.0 haben wir
pandas.DataFrame.convert_dtypes
. Sie können sogar steuern, welche Typen konvertiert werden sollen!quelle