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 auch to_datetime()
und to_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.
>>> s = pd.Series(["8", 6, "7.5", 3, "0.9"]) # mixed string and numeric values
>>> s
0 8
1 6
2 7.5
3 3
4 0.9
dtype: object
>>> pd.to_numeric(s) # convert everything to float values
0 8.0
1 6.0
2 7.5
3 3.0
4 0.9
dtype: float64
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:
# convert Series
my_series = pd.to_numeric(my_series)
# convert column "a" of a DataFrame
df["a"] = pd.to_numeric(df["a"])
Sie können es auch verwenden, um mehrere Spalten eines DataFrame über die folgende apply()
Methode zu konvertieren :
# convert all columns of DataFrame
df = df.apply(pd.to_numeric) # convert all columns of DataFrame
# convert just columns "a" and "b"
df[["a", "b"]] = df[["a", "b"]].apply(pd.to_numeric)
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 ein errors
Schlüsselwortargument verwendet, mit dem Sie nicht numerische Werte erzwingen NaN
oder Spalten mit diesen Werten einfach ignorieren können.
Hier ist ein Beispiel mit einer Reihe von Zeichenfolgen s
mit dem Objekt dtype:
>>> s = pd.Series(['1', '2', '4.7', 'pandas', '10'])
>>> s
0 1
1 2
2 4.7
3 pandas
4 10
dtype: object
Das Standardverhalten ist das Erhöhen, wenn ein Wert nicht konvertiert werden kann. In diesem Fall kann es mit der Zeichenfolge 'pandas' nicht umgehen:
>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')
ValueError: Unable to parse string
Anstatt zu scheitern, möchten wir vielleicht, dass 'Pandas' als fehlender / schlechter numerischer Wert betrachtet werden. NaN
Mit dem errors
Schlüsselwortargument können wir ungültige Werte wie folgt erzwingen:
>>> pd.to_numeric(s, errors='coerce')
0 1.0
1 2.0
2 4.7
3 NaN
4 10.0
dtype: float64
Die dritte Option für errors
besteht darin, die Operation zu ignorieren, wenn ein ungültiger Wert festgestellt wird:
>>> pd.to_numeric(s, errors='ignore')
# the original Series is returned untouched
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:
df.apply(pd.to_numeric, errors='ignore')
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 einen int64
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
oder int8
?
to_numeric()
bietet Ihnen die Möglichkeit, entweder auf "Ganzzahl", "Vorzeichen", "Vorzeichen" oder "Float" herunterzuspielen. Hier ist ein Beispiel für eine einfache Reihe s
von Ganzzahltypen:
>>> s = pd.Series([1, 2, -7])
>>> s
0 1
1 2
2 -7
dtype: int64
Beim Downcasting auf 'Ganzzahl' wird die kleinstmögliche Ganzzahl verwendet, die die Werte enthalten kann:
>>> pd.to_numeric(s, downcast='integer')
0 1
1 2
2 -7
dtype: int8
Beim Downcasting auf "Float" wird in ähnlicher Weise ein kleinerer als normaler Floating-Typ ausgewählt:
>>> pd.to_numeric(s, downcast='float')
0 1.0
1 2.0
2 -7.0
dtype: float32
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 :
# convert all DataFrame columns to the int64 dtype
df = df.astype(int)
# convert column "a" to int64 dtype and "b" to complex type
df = df.astype({"a": int, "b": complex})
# convert Series to float16 type
s = s.astype(np.float16)
# convert Series to Python strings
s = s.astype(str)
# convert Series to categorical type - see docs for more details
s = s.astype('category')
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 einen NaN
oder inf
-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:
>>> s = pd.Series([1, 2, -7])
>>> s
0 1
1 2
2 -7
dtype: int64
Dies sind kleine Ganzzahlen. Wie wäre es also mit einer Konvertierung in einen vorzeichenlosen 8-Bit-Typ, um Speicherplatz zu sparen?
>>> s.astype(np.uint8)
0 1
1 2
2 249
dtype: uint8
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:
>>> df = pd.DataFrame({'a': [7, 1, 5], 'b': ['3','2','1']}, dtype='object')
>>> df.dtypes
a object
b object
dtype: object
Mit infer_objects()
können Sie den Typ der Spalte 'a' in int64 ändern:
>>> df = df.infer_objects()
>>> df.dtypes
a int64
b object
dtype: object
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.