Sie haben vier Hauptoptionen zum Konvertieren von Typen in Pandas:
Lesen Sie weiter, um detailliertere Erklärungen und die Verwendung jeder dieser Methoden zu erhalten.
Der beste Weg, eine oder mehrere Spalten eines Datenrahmens in numerische Werte zu konvertieren, ist die Verwendung von pandas.to_numeric()
.
Diese Funktion versucht, nicht numerische Objekte (z. B. Zeichenfolgen) in Ganzzahlen oder Gleitkommazahlen umzuwandeln.
Grundlegende Verwendung
Die Eingabe in to_numeric()
ist eine Reihe oder eine einzelne Spalte eines Datenrahmens.,
Wie Sie sehen, wird eine neue Serie zurückgegeben. Denken Sie daran, diese Ausgabe einer Variablen oder einem Spaltennamen zuzuweisen, um sie weiterhin zu verwenden:
# convert Seriesmy_series = pd.to_numeric(my_series)# convert column "a" of a DataFramedf = pd.to_numeric(df)
Sie können damit auch mehrere Spalten eines Datenrahmens konvertieren über dieapply()
Methode:
Solange Ihre Werte alle konvertiert werden können, ist dies wahrscheinlich alles, was Sie benötigen.
Fehlerbehandlung
Aber was ist, wenn einige Werte nicht in einen numerischen Typ konvertiert werden können?,
to_numeric()
verwendet auch ein errors
Schlüsselwortargument, mit dem Sie nicht numerische Werte erzwingen können NaN
, oder ignorieren Sie einfach Spalten, die diese Werte enthalten.
Hier ist ein Beispiel für eine Reihe von Zeichenfolgen s
mit dem Objekt dtype:
>>> s = pd.Series()>>> s0 11 22 4.73 pandas4 10dtype: object
Das Standardverhalten besteht darin, einen Wert zu erhöhen, wenn er nicht konvertiert werden kann., In diesem Fall kann die Zeichenfolge ‚pandas’nicht verarbeitet werden:
>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')ValueError: Unable to parse string
Anstatt zu versagen, möchten wir möglicherweise, dass ‚pandas‘ als fehlender/schlechter numerischer Wert betrachtet werden., Wir können ungültige Werte zu NaN
wie folgt zwingen, indem wir das Schlüsselwortargument errors
verwenden:
>>> pd.to_numeric(s, errors='coerce')0 1.01 2.02 4.73 NaN4 10.0dtype: float64
Die dritte Option für errors
besteht nur darin, die Operation zu ignorieren, wenn ein ungültiger Wert gefunden wird:
>>> pd.to_numeric(s, errors='ignore')# the original Series is returned untouched
Diese letzte Option ist besonders nützlich, wenn Sie Ihren gesamten Datenrahmen konvertieren möchten, aber nicht wissen, welche unserer Spalten zuverlässig in einen numerischen Typ konvertiert werden kann., In diesem Fall schreiben Sie einfach:
df.apply(pd.to_numeric, errors='ignore')
Die Funktion wird auf jede Spalte des Datenrahmens angewendet. Spalten, die in einen numerischen Typ konvertiert werden können, werden konvertiert, während Spalten, die nicht konvertiert werden können (z. B. nicht-stellige Zeichenfolgen oder Daten enthalten), in Ruhe gelassen werden.
Downcasting
Standardmäßig erhalten Sie bei der Konvertierung mit to_numeric()
entweder eine int64
oder float64
dtype (oder eine beliebige ganzzahlige Breite, die für Ihre Plattform nativ ist).,
Das ist normalerweise das, was Sie wollen, aber was ist, wenn Sie etwas Speicher sparen und einen kompakteren dtype verwenden möchten, wie float32
oder int8
?
>>> s = pd.Series()>>> s0 11 22 -7dtype: int64
Das Downcasting auf ‚integer‘ verwendet die kleinstmögliche Ganzzahl, die die Werte enthalten kann:
>>> pd.to_numeric(s, downcast='integer')0 11 22 -7dtype: int8
Das Downcasting auf ‚float‘ wählt auf ähnliche Weise einen kleineren als normalen Float-Typ aus:
>>> pd.to_numeric(s, downcast='float')0 1.01 2.02 -7.0dtype: float32
astype()
Die können Sie den dtype, den Ihr Datenrahmen oder Ihre Serie haben soll, explizit angeben., Es ist sehr vielseitig, da Sie versuchen können, von einem Typ zum anderen zu wechseln.
Grundlegende Verwendung
Rufen Sie die Methode für das Objekt auf, das Sie konvertieren möchten, und astype()
wird versuchen, es für Sie zu konvertieren:
Beachten Sie, dass ich „try“ gesagt habe – wenn astype()
nicht weiß, wie ein Wert in der Serie oder im Datenrahmen konvertiert werden soll, wird ein Fehler ausgelöst. Wenn Sie beispielsweise einen NaN
oder inf
– Wert haben, wird beim Versuch, ihn in eine Ganzzahl zu konvertieren, ein Fehler angezeigt.
Ab Pandas 0.20.,0, dieser Fehler kann unterdrückt werden, indem errors='ignore'
. Ihr ursprüngliches Objekt bleibt unberührt.
Seien Sie vorsichtig
astype()
ist leistungsstark, konvertiert aber manchmal Werte „falsch“. Zum Beispiel:
>>> s = pd.Series()>>> s0 11 22 -7dtype: int64
Dies sind kleine ganze Zahlen, also wie wäre es mit der Konvertierung in einen vorzeichenlosen 8-Bit-Typ, um Speicher zu sparen?
>>> s.astype(np.uint8)0 11 22 249dtype: uint8
Die Konvertierung funktionierte, aber die Konvertierung wurde auf 249 (dh 28-7) umwickelt!
Der Versuch, stattdessen pd.to_numeric(s, downcast='unsigned')
zu downcasten, kann diesen Fehler verhindern.,
infer_objects ()
Version 0.21.0 von pandas führte die Methode infer_objects()
zum Konvertieren von Spalten eines Datenrahmens mit einem Objektdatentyp in einen spezifischeren Typ ein (soft conversions).
Zum Beispiel ist hier ein Datenrahmen mit zwei Spalten vom Objekttyp. Einer enthält tatsächliche Ganzzahlen und der andere enthält Zeichenfolgen, die Ganzzahlen darstellen:
>>> df = pd.DataFrame({'a': , 'b': }, dtype='object')>>> df.dtypesa objectb objectdtype: object
Mit infer_objects()
können Sie den Spaltentyp ‚a‘ in int64 ändern:
>>> df = df.infer_objects()>>> df.dtypesa int64b objectdtype: object
Die Spalte ‚b‘ wurde in Ruhe gelassen, da ihre Werte Zeichenfolgen und keine Ganzzahlen waren., Wenn Sie wollten, um zu versuchen und die Kraft der Umwandlung der beiden Spalten, um eine integer-Typ, den Sie verwenden könnten df.astype(int)
statt.
convert_dtypes()
Version 1.0 und höher enthält eine Methode convert_dtypes()
konvertieren Series und DataFrame-Spalten, um den bestmöglichen dtype unterstützt, dass die pd.NA
missing-Wert.
Hier „bestmöglich“ bedeutet, dass der Typ am besten geeignet, um halten Sie die Werte., Dies ist beispielsweise ein Pandas-Integer-Typ, wenn alle Werte Ganzzahlen (oder fehlende Werte) sind: Eine Objektspalte von Python-Integer-Objekten wird in Int64
konvertiert, eine Spalte von NumPy int32
– Werten wird zum Pandas-dtype Int32
.,
Mit unserem object
DataFrame df
erhalten wir das folgende Ergebnis:
>>> df.convert_dtypes().dtypes a Int64b stringdtype: object
Da die Spalte ‚a‘ ganzzahlige Werte enthielt, wurde sie in den Typ Int64
konvertiert (der im Gegensatz zu int64
).
Spalte ‚b‘ enthielt String-Objekte, also wurde in pandas ‚ string
dtype geändert.
Standardmäßig leitet diese Methode den Typ aus den Objektwerten in jeder Spalte ab., Wir können dies ändern, indem wir infer_objects=False
:
>>> df.convert_dtypes(infer_objects=False).dtypes a objectb stringdtype: object
Jetzt blieb Spalte ‚a‘ eine Objektspalte: pandas weiß, dass es als ‚integer‘ Spalte beschrieben werden kann (intern lief es infer_dtype
), aber nicht genau abgeleitet, welchen dtype von integer es haben sollte, also nicht konvertiert. Die Spalte ‚b‘ wieder umgewandelt zu ’string‘ dtype, wie es war anerkannt als holding ’string‘ Werte.