Wenn Sie dtype('O')
innerhalb des Datenrahmens sehen, bedeutet dies eine Pandas-Zeichenfolge.
Was ist dtype
?
Etwas, das gehört pandas
oder numpy
oder beides oder etwas anderes? Wenn wir den Pandas-Code untersuchen:
df = pd.DataFrame({'float': [1.0],
'int': [1],
'datetime': [pd.Timestamp('20180310')],
'string': ['foo']})
print(df)
print(df['float'].dtype,df['int'].dtype,df['datetime'].dtype,df['string'].dtype)
df['string'].dtype
Es wird wie folgt ausgegeben:
float int datetime string
0 1.0 1 2018-03-10 foo
---
float64 int64 datetime64[ns] object
---
dtype('O')
Sie können das letzte dtype('O')
Objekt als Pandas oder Pandas-Objekt interpretieren, bei dem es sich um eine Python-Zeichenfolge handelt, die Numpy string_
oder unicode_
Typen entspricht.
Pandas dtype Python type NumPy type Usage
object str string_, unicode_ Text
Wie Don Quijote auf dem Arsch ist, ist Pandas auf Numpy und Numpy versteht die zugrunde liegende Architektur Ihres Systems und verwendet die Klasse numpy.dtype
dafür.
Das Datentypobjekt ist eine Instanz einer numpy.dtype
Klasse, die den Datentyp genauer versteht, einschließlich:
- Datentyp (Ganzzahl, Float, Python-Objekt usw.)
- Größe der Daten (wie viele Bytes sind zB die Ganzzahl)
- Bytereihenfolge der Daten (Little-Endian oder Big-Endian)
- Wenn der Datentyp strukturiert ist, ein Aggregat anderer Datentypen (z. B. Beschreibung eines Array-Elements, das aus einer Ganzzahl und einem Gleitkomma besteht)
- Wie heißen die "Felder" der Struktur?
- Was ist der Datentyp jedes Feldes?
- Welchen Teil des Speicherblocks nimmt jedes Feld ein?
- Wenn der Datentyp ein Unterarray ist, wie ist seine Form und sein Datentyp?
Im Kontext dieser Frage dtype
gehört sowohl zu pands als auch zu numpy und dtype('O')
bedeutet insbesondere, dass wir den String erwarten.
Hier ist ein Code zum Testen mit Erklärung: Wenn wir den Datensatz als Wörterbuch haben
import pandas as pd
import numpy as np
from pandas import Timestamp
data={'id': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5}, 'date': {0: Timestamp('2018-12-12 00:00:00'), 1: Timestamp('2018-12-12 00:00:00'), 2: Timestamp('2018-12-12 00:00:00'), 3: Timestamp('2018-12-12 00:00:00'), 4: Timestamp('2018-12-12 00:00:00')}, 'role': {0: 'Support', 1: 'Marketing', 2: 'Business Development', 3: 'Sales', 4: 'Engineering'}, 'num': {0: 123, 1: 234, 2: 345, 3: 456, 4: 567}, 'fnum': {0: 3.14, 1: 2.14, 2: -0.14, 3: 41.3, 4: 3.14}}
df = pd.DataFrame.from_dict(data) #now we have a dataframe
print(df)
print(df.dtypes)
In den letzten Zeilen wird der Datenrahmen untersucht und die Ausgabe notiert:
id date role num fnum
0 1 2018-12-12 Support 123 3.14
1 2 2018-12-12 Marketing 234 2.14
2 3 2018-12-12 Business Development 345 -0.14
3 4 2018-12-12 Sales 456 41.30
4 5 2018-12-12 Engineering 567 3.14
id int64
date datetime64[ns]
role object
num int64
fnum float64
dtype: object
Alles irgendwie anders dtypes
df.iloc[1,:] = np.nan
df.iloc[2,:] = None
Aber wenn wir versuchen , Satz np.nan
oder None
dies nicht die ursprüngliche Spalte dtype beeinflussen. Die Ausgabe sieht folgendermaßen aus:
print(df)
print(df.dtypes)
id date role num fnum
0 1.0 2018-12-12 Support 123.0 3.14
1 NaN NaT NaN NaN NaN
2 NaN NaT None NaN NaN
3 4.0 2018-12-12 Sales 456.0 41.30
4 5.0 2018-12-12 Engineering 567.0 3.14
id float64
date datetime64[ns]
role object
num float64
fnum float64
dtype: object
So np.nan
oder None
nicht die Spalten ändern dtype
, es sei denn , wir die alle Spaltenzeilen gesetzt np.nan
oder None
. In diesem Fall Spalte werden float64
oder object
sind.
Sie können auch versuchen, einzelne Zeilen festzulegen:
df.iloc[3,:] = 0 # will convert datetime to object only
df.iloc[4,:] = '' # will convert all columns to object
Und wenn wir hier einen String in einer Nicht-String-Spalte setzen, wird er zu einem String oder Objekt dtype
.
pandas
verwendetobject
dtype frei, wenn Spalten gemischte Werte enthalten (Strings, Zahlen, Nan).