Suche…


Bemerkungen

dtypes sind nicht Pandabären. Sie sind ein Ergebnis der Pandas, die eng mit Numpy verbunden sind.

Der D-Typ einer Spalte muss in keiner Weise mit dem Python-Typ des in der Spalte enthaltenen Objekts korrelieren.

Hier haben wir eine pd.Series mit Schwimmern. Der Typ wird float .

Dann verwenden wir einen astype , um es in ein Objekt astype .

pd.Series([1.,2.,3.,4.,5.]).astype(object)
0    1
1    2
2    3
3    4
4    5
dtype: object

Der dtype ist jetzt object, aber die Objekte in der Liste sind immer noch float. Logisch, wenn Sie wissen, dass in Python alles ein Objekt ist und auf Objekt hochgefahren werden kann.

type(pd.Series([1.,2.,3.,4.,5.]).astype(object)[0])
float

Hier versuchen wir, die Schwimmer zu Saiten zu "gießen".

pd.Series([1.,2.,3.,4.,5.]).astype(str)
0    1.0
1    2.0
2    3.0
3    4.0
4    5.0
dtype: object

Der dtype ist jetzt object, aber der Typ der Einträge in der Liste ist string. Dies ist darauf zurückzuführen, dass sich numpy nicht mit Strings befasst und sich so numpy , als ob es sich nur um Objekte numpy die nichts numpy .

type(pd.Series([1.,2.,3.,4.,5.]).astype(str)[0])
str

Vertrauen Sie nicht D-Typen, sie sind ein Artefakt eines architektonischen Fehlers in Pandas. Geben Sie sie an, wie Sie müssen, aber verlassen Sie sich nicht darauf, welcher Datentyp für eine Spalte festgelegt ist.

Überprüfen der Spaltenarten

Spaltentypen können überprüft werden .dtypes atrribute von Datenrahmen.

In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0], 'C': [True, False, True]})

In [2]: df
Out[2]:
   A    B      C
0  1  1.0   True
1  2  2.0  False
2  3  3.0   True

In [3]: df.dtypes
Out[3]:
A      int64
B    float64
C       bool
dtype: object

Für eine einzelne Serie können Sie das Attribut .dtype .

In [4]: df['A'].dtype
Out[4]: dtype('int64')

Dtypes ändern

astype() -Methode ändert den dtype einer Serie und gibt eine neue Serie zurück.

In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0], 
                           'C': ['1.1.2010', '2.1.2011', '3.1.2011'], 
                           'D': ['1 days', '2 days', '3 days'],
                           'E': ['1', '2', '3']})
In [2]: df
Out[2]:
   A    B          C       D  E
0  1  1.0   1.1.2010  1 days  1
1  2  2.0   2.1.2011  2 days  2
2  3  3.0   3.1.2011  3 days  3

In [3]: df.dtypes
Out[3]:
A      int64
B    float64
C     object
D     object
E     object
dtype: object

Ändern Sie den Typ von Spalte A in Float und den Typ von Spalte B in Ganzzahl:

In [4]: df['A'].astype('float')
Out[4]:
0    1.0
1    2.0
2    3.0
Name: A, dtype: float64

In [5]: df['B'].astype('int')
Out[5]:
0    1
1    2
2    3
Name: B, dtype: int32

astype() -Methode ist für bestimmte Typumwandlungen .astype(float64') Sie können .astype(float64') , .astype(float32) oder .astype(float16) ). Zur allgemeinen Konvertierung können Sie pd.to_numeric , pd.to_datetime und pd.to_timedelta .

Ändern Sie den Typ in numerisch

pd.to_numeric ändert die Werte in einen numerischen Typ.

In [6]: pd.to_numeric(df['E'])
Out[6]:
0    1
1    2
2    3
Name: E, dtype: int64

Standardmäßig gibt pd.to_numeric einen Fehler aus, wenn eine Eingabe nicht in eine Zahl konvertiert werden kann. Sie können dieses Verhalten ändern, indem Sie den errors .

# Ignore the error, return the original input if it cannot be converted
In [7]: pd.to_numeric(pd.Series(['1', '2', 'a']), errors='ignore')
Out[7]:
0    1
1    2
2    a
dtype: object

# Return NaN when the input cannot be converted to a number
In [8]: pd.to_numeric(pd.Series(['1', '2', 'a']), errors='coerce')
Out[8]:
0    1.0
1    2.0
2    NaN
dtype: float64

Bei Bedarf können nicht alle Zeilen mit Eingabe in eine numerische Verwendung konvertiert werden. Verwenden Sie die boolean indexing mit isnull :

In [9]: df = pd.DataFrame({'A': [1, 'x', 'z'],
                           'B': [1.0, 2.0, 3.0],
                           'C': [True, False, True]})

In [10]: pd.to_numeric(df.A, errors='coerce').isnull()
Out[10]: 
0    False
1     True
2     True
Name: A, dtype: bool

In [11]: df[pd.to_numeric(df.A, errors='coerce').isnull()]
Out[11]: 
   A    B      C
1  x  2.0  False
2  z  3.0   True

Ändern des Typs in datetime

In [12]: pd.to_datetime(df['C'])
Out[12]:
0   2010-01-01
1   2011-02-01
2   2011-03-01
Name: C, dtype: datetime64[ns]

Beachten Sie, dass 2.1.2011 in den 1. Februar 2011 konvertiert wird. Wenn Sie stattdessen den 2. Januar 2011 verwenden möchten, müssen Sie den Parameter dayfirst .

In [13]: pd.to_datetime('2.1.2011', dayfirst=True)
Out[13]: Timestamp('2011-01-02 00:00:00')

Ändern des Typs in Timedelta

In [14]: pd.to_timedelta(df['D'])
Out[14]:
0   1 days
1   2 days
2   3 days
Name: D, dtype: timedelta64[ns]

Auswählen von Spalten basierend auf dtype

select_dtypes Methode kann verwendet werden, um Spalten basierend auf dtype auszuwählen.

In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0], 'C': ['a', 'b', 'c'], 
                           'D': [True, False, True]})

In [2]: df
Out[2]: 
   A    B  C      D
0  1  1.0  a   True
1  2  2.0  b  False
2  3  3.0  c   True

Mit include und exclude Parametern können Sie angeben, welche Typen Sie möchten:

# Select numbers
In [3]: df.select_dtypes(include=['number'])  # You need to use a list
Out[3]:
   A    B
0  1  1.0
1  2  2.0
2  3  3.0    

# Select numbers and booleans
In [4]: df.select_dtypes(include=['number', 'bool'])
Out[4]:
   A    B      D
0  1  1.0   True
1  2  2.0  False
2  3  3.0   True

# Select numbers and booleans but exclude int64
In [5]: df.select_dtypes(include=['number', 'bool'], exclude=['int64'])
Out[5]:
     B      D
0  1.0   True
1  2.0  False
2  3.0   True

Zusammenfassende dtypes

get_dtype_counts Methode kann verwendet werden, um eine Aufschlüsselung der dtypes anzuzeigen.

In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0], 'C': ['a', 'b', 'c'], 
                           'D': [True, False, True]})

In [2]: df.get_dtype_counts()
Out[2]: 
bool       1
float64    1
int64      1
object     1
dtype: int64


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow