Skip to content

Pandas: DataFrame mit astype() auf einen bestimmten dtype übertragen

Python

pandas.Series hat einen Datentyp dtype und pandas.DataFrame hat einen anderen Datentyp dtype für jede Spalte.

Sie können dtype angeben, wenn Sie ein neues Objekt mit einem Konstruktor erstellen oder aus einer CSV-Datei lesen usw., oder es mit der Methode astype() umwandeln.

Dieser Artikel hat folgenden Inhalt.

  • Liste der einfachen Datentypen (dtype) in Pandas
  • Objekttyp und Zeichenfolge
    • Spezieller Datentyp, Objekt
    • Hinweis: String-Methoden
    • Hinweis:NaN
  • Cast-Datentyp (dtype) mit astype()
    • Cast-Datentyp von pandas.Series
    • Cast-Datentyp aller Spalten von pandas.DataFrame
    • Cast-Datentyp jeder Spalte von pandas.DataFrame einzeln
  • Datentyp (dtype) beim Lesen von CSV-Dateien mit read_csv() angeben
    • Geben SIE für alle Spalten betrachtet Datentyp an
    • Geben SIE den Datentyp für jede Spalte an
  • Implizite Typkonvertierungen
    • Implizite Typkonvertierung durch arithmetische Operationen
    • Implizite Typkonvertierung durch Transposition etc.
    • Implizite Typkonvertierung durch Zuweisung an Elemente

Siehe den following Artikel über die Datentypen dtype und astype() in NumPy.

Im following Artikel erfahren SIE, wie SIE Spalten nach dtype extrahieren.

Die Pandas-Version im folgenden Beispielcode ist 1.4.1. Beachten Sie, dass das Verhalten je nach Version unterschiedlich sein kann.

import pandas as pd
import numpy as np

print(pd.__version__)
# 1.4.1

Liste der einfachen Datentypen (dtype) in Pandas

Das Folgende ist eine Liste der einfachen Datentypen in Pandas.

dtyp Zeichencode Benennung
int8 i1 8-Bit-Ganzzahl mit Vorzeichen
int16 i2 16-Bit-Ganzzahl mit Vorzeichen
int32 i4 32-Bit-Ganzzahl mit Vorzeichen
int64 i8 64-Bit-Ganzzahl mit Vorzeichen
uint8 u1 8-Bit-Ganzzahl ohne Vorzeichen
uint16 u2 16-Bit-Ganzzahl ohne Vorzeichen
uint32 u4 32-Bit-Ganzzahl ohne Vorzeichen
uint64 u8 64-Bit-Ganzzahl ohne Vorzeichen
float16 f2 16-Bit-Gleitkommazahl
float32 f4 32-Bit-Gleitkommazahl
float64 f8 64-Bit-Gleitkommazahl
float128 F 16 128-Bit-Gleitkommazahl
komplex64 c8 Komplexe 64-Bit-Gleitkommazahl
Komplex128 c16 Komplexe 128-Bit-Gleitkommazahl
Komplex256 c32 Komplexe 256-Bit-Gleitkommazahl
bool ? Boolean (Wahr oder Falsch)
Unicode U Unicode-String
Objekt Ö Python-Objekte

Die Zahlen von dtype sind in Bit und die Zahlen von Zeichencode sind in Byte. Beachten Sie, dass die Nummern auch für den gleichen Typ unterschiedlich sind.

Der Zeichencode für den Typ bool, ?, bedeutet nicht unbekannt, sondern wörtlich ? zugeordnet ist.

Bei der Angabe des Datentyps dtype beispielsweise für den Typ float64 ist Folgendes zulässig.

  • np.float64
  • ‚float64‘
  • ‚f8‘
s = pd.Series([0, 1, 2], dtype=np.float64)
print(s.dtype)
# float64

s = pd.Series([0, 1, 2], dtype='float64')
print(s.dtype)
# float64

s = pd.Series([0, 1, 2], dtype='f8')
print(s.dtype)
# float64

Sie können sie mit Python-Typen wie int, float oder str ohne bitgenaue Zahlen angeben.

In diesem Fall wird er in den entsprechenden Typ umgewandelt. Beispiele in Python3, 64-Bit-Umgebung sind wie folgt. uint ist kein Python-Typ, WIRD aber der Einfachheit halber zusammen aufgelistet.

Python-Typ Beispiel für äquivalenten dtype
int int64
schweben float64
Str Objekt (Jedes Element ist str)
(nicht) uint64

Sie können int oder float oder string ‚int‘, ‚float‘ verwenden. Sie can uint nicht verwenden, da es sich nicht um einen Python-Typ handelt.

s = pd.Series([0, 1, 2], dtype='float')
print(s.dtype)
# float64

s = pd.Series([0, 1, 2], dtype=float)
print(s.dtype)
# float64

s = pd.Series([0, 1, 2], dtype='uint')
print(s.dtype)
# uint64

Mit np.iinfo() und np.finfo() can SIE den Bereich der theoretischen Werte (Mindest- und Höchstwerte) für Integer- und Fließkommazahlentypen überprüfen. Nichts finden Sie im folgenden Artikel.

Die hier vorgestellten Datentypen basieren im vorgestellten auf NumPy, Pandas hat jedoch einige eigene Datentypen erweitert.

Objekttyp und Zeichenfolge

This Abschnitt Den Objekttyp Und sterben Zeichenfolge str.

Beachten Sie, dass StringDtype in Pandas-Version 1.0.0 als Datentyp für Zeichenfolgen eingeführt wurde. Dieser Typ könnte in Zukunft zum Mainstream werden, wird hier aber nicht erwähnt. Nicht verfügbar finden Sie in der offiziellen Dokumentation.

Spezieller Datentyp, Objekt

Der Objekttyp ist ein spezieller Datentyp, der Zeiger auf Python-Objekte speichert. Jedes Element kann einen anderen Typ haben.

In Pandas ist der Datentyp von Serien- und DataFrame-Spalten, die Zeichenfolgen enthalten, Objekt, aber jedes Element hat seinen eigenen Typ, und nicht alle Elemente sind Zeichenfolgen.

Beispiele:

Die np.nan repräsentiert den fehlenden Wert.

Die eingebaute type()-Funktion wird mit der map()-Methode angewendet, um den Typ jedes Elements zu überprüfen.

s_object = pd.Series([0, 'abcde', np.nan])
print(s_object)
# 0        0
# 1    abcde
# 2      NaN
# dtype: object

print(s_object.map(type))
# 0      <class 'int'>
# 1      <class 'str'>
# 2    <class 'float'>
# dtype: object

Wenn str in astype() angegeben ist (siehe unten für Details), werden alle Elemente einschließlich NaN in str konvertiert. dtype bleibt Objekt.

s_str_astype = s_object.astype(str)
print(s_str_astype)
# 0        0
# 1    abcde
# 2      nan
# dtype: object

print(s_str_astype.map(type))
# 0    <class 'str'>
# 1    <class 'str'>
# 2    <class 'str'>
# dtype: object

Wenn str im dtype-Parameter des Konstruktors angegeben ist, bleibt NaN Float. Beachten Sie, dass NaN in Version 0.22.0 auch in str konvertiert wurde.

s_str_constructor = pd.Series([0, 'abcde', np.nan], dtype=str)
print(s_str_constructor)
# 0        0
# 1    abcde
# 2      NaN
# dtype: object

print(s_str_constructor.map(type))
# 0      <class 'str'>
# 1      <class 'str'>
# 2    <class 'float'>
# dtype: object

Hinweis: String-Methoden

Beachten Sie, dass selbst wenn dtype derselbe Objekttyp ist, das Ergebnis der String-Methode mit dem str-Accessor je nach Elementtyp unterschiedlich ist.

Wenn Sie beispielsweise str.len() anwenden, das sterben Anzahl der Zeichen zurückgibt, gibt ein Element des numerischen Typs NaN zurück.

print(s_str_astype.str.len())
# 0    1
# 1    5
# 2    3
# dtype: int64

print(s_object.str.len())
# 0    NaN
# 1    5.0
# 2    NaN
# dtype: float64

Wenn das Ergebnis der String-Methode NaN enthält, darf jedes Element nicht str sein, selbst wenn der Datentyp der Spalte Objekt ist. Sie können astype(str) vor der String-Methode anwenden.

print(s_object.astype(str).str.len())
# 0    1
# 1    5
# 2    3
# dtype: int64

Hinweis:NaN

Den fehlenden Wert NaN can SIE mit isnull() ermitteln oder mit dropna() entfernen.

print(s_object)
# 0        0
# 1    abcde
# 2      NaN
# dtype: object

print(s_object.map(type))
# 0      <class 'int'>
# 1      <class 'str'>
# 2    <class 'float'>
# dtype: object

print(s_object.isnull())
# 0    False
# 1    False
# 2     True
# dtype: bool

print(s_object.dropna())
# 0        0
# 1    abcde
# dtype: object

Beachten Sie, dass NaN bei der Umwandlung in die Zeichenfolge str zur Zeichenfolge „nan“ WIRD und nicht als fehlender Wert behandelt WIRD.

print(s_str_astype)
# 0        0
# 1    abcde
# 2      nan
# dtype: object

print(s_str_astype.map(type))
# 0    <class 'str'>
# 1    <class 'str'>
# 2    <class 'str'>
# dtype: object

print(s_str_astype.isnull())
# 0    False
# 1    False
# 2    False
# dtype: bool

print(s_str_astype.dropna())
# 0        0
# 1    abcde
# 2      nan
# dtype: object

Sie können ihn vor dem Casting als fehlenden Wert behandeln oder den String „nan“ mit replace() durch NaN ersetzen.

s_str_astype_nan = s_str_astype.replace('nan', np.nan)
print(s_str_astype_nan)
# 0        0
# 1    abcde
# 2      NaN
# dtype: object

print(s_str_astype_nan.map(type))
# 0      <class 'str'>
# 1      <class 'str'>
# 2    <class 'float'>
# dtype: object

print(s_str_astype_nan.isnull())
# 0    False
# 1    False
# 2     True
# dtype: bool

Cast-Datentyp (dtype) mit astype()

Sie können den Datentyp dtype mit der Methode astype() von pandas.DataFrame, pandas.Series umwandeln.

astype() gibt eine neue pandas.Series oder pandas.DataFrame mit neuem dtype zurück. Das ursprüngliche Objekt wird nicht verändert.

Verwenden Sie die folgenden Daten als Beispiel.

df = pd.read_csv('data/src/sample_header.csv')
print(df)
#     a   b   c   d
# 0  11  12  13  14
# 1  21  22  23  24
# 2  31  32  33  34

s = df['c']
print(s)
# 0    13
# 1    23
# 2    33
# Name: c, dtype: int64

Cast-Datentyp von pandas.Series

Wenn Sie den Datentyp dtype in der Methode astype() von pandas.Series angeben, wird eine neue pandas.Series zurückgegeben. Die ursprüngliche Pandas.Serie bleibt unverändert.

s_f = s.astype('float64')
print(s_f)
# 0    13.0
# 1    23.0
# 2    33.0
# Name: c, dtype: float64

print(s)
# 0    13
# 1    23
# 2    33
# Name: c, dtype: int64

Wie oben erwähnt, können Sie den Typ in verschiedenen Formen angeben.

s_f = s.astype('float')
print(s_f.dtype)
# float64

s_f = s.astype(float)
print(s_f.dtype)
# float64

s_f = s.astype('f8')
print(s_f.dtype)
# float64

Cast-Datentyp aller Spalten von pandas.DataFrame

pandas.DataFrame hat für jede Spalte den Datentyp dtype.

Sie können jeden dtype mit dem Attribut dtypes überprüfen.

print(df)
#     a   b   c   d
# 0  11  12  13  14
# 1  21  22  23  24
# 2  31  32  33  34

print(df.dtypes)
# a    int64
# b    int64
# c    int64
# d    int64
# dtype: object

Wenn Sie in der Methode astype() von pandas.DataFrame den Datentyp dtype angeben, werden die Datentypen aller Spalten geändert.

df_f = df.astype('float64')
print(df_f)
#       a     b     c     d
# 0  11.0  12.0  13.0  14.0
# 1  21.0  22.0  23.0  24.0
# 2  31.0  32.0  33.0  34.0

print(df_f.dtypes)
# a    float64
# b    float64
# c    float64
# d    float64
# dtype: object

Cast-Datentyp jeder Spalte von pandas.DataFrame einzeln

Sie können den Datentyp dtype jeder Spalte einzeln ändern, indem Sie ein Wörterbuch von {Spaltenname: Datentyp} in astype() angeben.

df_fcol = df.astype({'a': float})
print(df_fcol)
#       a   b   c   d
# 0  11.0  12  13  14
# 1  21.0  22  23  24
# 2  31.0  32  33  34

print(df_fcol.dtypes)
# a    float64
# b      int64
# c      int64
# d      int64
# dtype: object

df_fcol2 = df.astype({'a': 'float32', 'c': 'int8'})
print(df_fcol2)
#       a   b   c   d
# 0  11.0  12  13  14
# 1  21.0  22  23  24
# 2  31.0  32  33  34

print(df_fcol2.dtypes)
# a    float32
# b      int64
# c       int8
# d      int64
# dtype: object

Datentyp (dtype) beim Lesen von CSV-Dateien mit read_csv() angeben

In Pandas können Sie CSV-Dateien mit pd.read_csv() lesen. Mit dem Parameter dtype can SIE einen beliebigen Datentyp angeben.

Verwenden Sie die folgende CSV-Datei als Beispiel.

,a,b,c,d
ONE,1,"001",100,x
TWO,2,"020",,y
THREE,3,"300",300,z

Wenn das Argument dtype weggelassen WIRD, WIRD der Datentyp automatisch für jede Spalte ausgewählt.

df = pd.read_csv('data/src/sample_header_index_dtype.csv', index_col=0)
print(df)
#        a    b      c  d
# ONE    1    1  100.0  x
# TWO    2   20    NaN  y
# THREE  3  300  300.0  z

print(df.dtypes)
# a      int64
# b      int64
# c    float64
# d     object
# dtype: object

print(df.applymap(type))
#                    a              b                c              d
# ONE    <class 'int'>  <class 'int'>  <class 'float'>  <class 'str'>
# TWO    <class 'int'>  <class 'int'>  <class 'float'>  <class 'str'>
# THREE  <class 'int'>  <class 'int'>  <class 'float'>  <class 'str'>

Geben SIE für alle Spalten betrachtet Datentyp an

Wenn SIE einen Datentyp für den Parameter dtype angeben, werden alle Spalten in diesen Typ konvertiert.

Wenn es Spalten gibt, die nicht in den angegebenen Datentyp konvertiert werden können, WIRD ein Fehler ausgelöst.

# pd.read_csv('data/src/sample_header_index_dtype.csv',
#             index_col=0, dtype=float)
# ValueError: could not convert string to float: 'ONE'

Bei dtype=str wird der fehlende Wert NaN nicht in str umgewandelt.

df_str = pd.read_csv('data/src/sample_header_index_dtype.csv',
                     index_col=0, dtype=str)
print(df_str)
#        a    b    c  d
# ONE    1  001  100  x
# TWO    2  020  NaN  y
# THREE  3  300  300  z

print(df_str.dtypes)
# a    object
# b    object
# c    object
# d    object
# dtype: object

print(df_str.applymap(type))
#                    a              b                c              d
# ONE    <class 'str'>  <class 'str'>    <class 'str'>  <class 'str'>
# TWO    <class 'str'>  <class 'str'>  <class 'float'>  <class 'str'>
# THREE  <class 'str'>  <class 'str'>    <class 'str'>  <class 'str'>

Wenn Sie einen fehlenden Wert in den String ’nan‘ konvertieren möchten, lesen Sie ihn ohne Angabe von dtype und wandeln Sie ihn dann mit astype() in str um.

print(df.astype(str).applymap(type))
#                    a              b              c              d
# ONE    <class 'str'>  <class 'str'>  <class 'str'>  <class 'str'>
# TWO    <class 'str'>  <class 'str'>  <class 'str'>  <class 'str'>
# THREE  <class 'str'>  <class 'str'>  <class 'str'>  <class 'str'>

Geben SIE den Datentyp für jede Spalte an

Wie bei astype() can SIE ein Wörterbuch verwenden, um den Datentyp für jede Spalte in read_csv() anzugeben.

df_col = pd.read_csv('data/src/sample_header_index_dtype.csv',
                     index_col=0, dtype={'a': str, 'b': float})
print(df_col)
#        a      b      c  d
# ONE    1    1.0  100.0  x
# TWO    2   20.0    NaN  y
# THREE  3  300.0  300.0  z

print(df_col.dtypes)
# a     object
# b    float64
# c    float64
# d     object
# dtype: object

SIE can die Spaltennummer anstelle des Spaltennamens angeben. Beachten Sie, dass SIE bei der Angabe einer Indexspalte die Spaltennummer einschließlich der Indexspalte angeben müssen.

df_col = pd.read_csv('data/src/sample_header_index_dtype.csv',
                     index_col=0, dtype={1: str, 2: float})
print(df_col)
#        a      b      c  d
# ONE    1    1.0  100.0  x
# TWO    2   20.0    NaN  y
# THREE  3  300.0  300.0  z

print(df_col.dtypes)
# a     object
# b    float64
# c    float64
# d     object
# dtype: object

Implizite Typkonvertierungen

Zusätzlich zur expliziten Typkonvertierung durch astype() can Datentypen implizit durch verschiedene Operationen konvertiert werden.

Verwenden Sie pandas.DataFrame mit Spalten von Integer Int und Spalten von Fließkommazahlen als Beispiel.

df_mix = pd.DataFrame({'col_int': [0, 1, 2], 'col_float': [0.0, 0.1, 0.2]}, index=['A', 'B', 'C'])
print(df_mix)
#    col_int  col_float
# A        0        0.0
# B        1        0.1
# C        2        0.2

print(df_mix.dtypes)
# col_int        int64
# col_float    float64
# dtype: object

Implizite Typkonvertierung durch arithmetische Operationen

Beispiel ist das Ergebnis der Addition einer int-Spalte mit einer Float-Spalte durch den +-Operator ein Float.

print(df_mix['col_int'] + df_mix['col_float'])
# A    0.0
# B    1.1
# C    2.2
# dtype: float64

Ebenso konvertieren Operationen mit skalaren Werten implizit den Datentyp. Das Ergebnis der Division durch den /-Operator ist Float.

print(df_mix / 1)
#    col_int  col_float
# A      0.0        0.0
# B      1.0        0.1
# C      2.0        0.2

print((df_mix / 1).dtypes)
# col_int      float64
# col_float    float64
# dtype: object

Bei +, -, *, // und ** geben Operationen zwischen ganzen Zahlen int zurück und Operationen mit Gleitkommazahlen geben float zurück. Dies entspricht der impliziten Typkonvertierung des NumPy-Arrays ndarray.

print(df_mix * 1)
#    col_int  col_float
# A        0        0.0
# B        1        0.1
# C        2        0.2

print((df_mix * 1).dtypes)
# col_int        int64
# col_float    float64
# dtype: object

print(df_mix * 1.0)
#    col_int  col_float
# A      0.0        0.0
# B      1.0        0.1
# C      2.0        0.2

print((df_mix * 1.0).dtypes)
# col_int      float64
# col_float    float64
# dtype: object

Implizite Typkonvertierung durch Transposition etc.

Der Typ kann auch konvertiert werden, wenn eine Zeile als pandas.Series mit loc oder iloc ausgewählt wird oder wenn pandas.DataFrame mit T oder transpose() transponiert wird. Beispiel wird ein ganzzahliges Element in eine Fließkommazahl konvertiert.

print(df_mix.loc['A'])
# col_int      0.0
# col_float    0.0
# Name: A, dtype: float64

print(df_mix.T)
#              A    B    C
# col_int    0.0  1.0  2.0
# col_float  0.0  0.1  0.2

print(df_mix.T.dtypes)
# A    float64
# B    float64
# C    float64
# dtype: object

Implizite Typkonvertierung durch Zuweisung an Elemente

Der Datentyp kann auch implizit konvertiert werden, wenn einem Element ein Wert zugewiesen wird.

Wenn Sie beispielsweise ein Element von float einer Spalte von int zuweisen, wird diese Spalte in float konvertiert. Auch die Zuweisung eines Elements von int zu einer Spalte von float wandelt dieses Element in float um.

df_mix.at['A', 'col_int'] = 10.1
df_mix.at['A', 'col_float'] = 10
print(df_mix)
#    col_int  col_float
# A     10.1       10.0
# B      1.0        0.1
# C      2.0        0.2

print(df_mix.dtypes)
# col_int      float64
# col_float    float64
# dtype: object

Wenn einer numerischen Spalte ein Buchstabenelement zugewiesen WIRD, WIRD der Datentyp der Spalte in ein Objekt umgewandelt.

df_mix.at['A', 'col_float'] = 'abc'
print(df_mix)
#    col_int col_float
# A     10.1       abc
# B      1.0       0.1
# C      2.0       0.2

print(df_mix.dtypes)
# col_int      float64
# col_float     object
# dtype: object

print(df_mix.applymap(type))
#            col_int        col_float
# A  <class 'float'>    <class 'str'>
# B  <class 'float'>  <class 'float'>
# C  <class 'float'>  <class 'float'>

Beachten Sie, dass der obige Beispielcode das Ergebnis von Version 1.4.1 ist. In Version 0.22.0 blieb der Spaltentyp auch nach Zuweisung eines Elements eines anderen Typs gleich, aber der Typ des zugewiesenen Elements sich. Sie, dass sich das Verhalten je nach Version unterscheidet.