Ändern Sie den Spaltentyp in Pandas

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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.