
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.