Was ist dtype ('O') bei Pandas?

105

Ich habe einen Datenrahmen in Pandas und ich versuche herauszufinden, welche Arten von Werten es gibt. Ich bin mir nicht sicher, um welchen Spaltentyp es sich handelt 'Test'. Wenn ich jedoch renne myFrame['Test'].dtype, bekomme ich;

dtype('O')

Was bedeutet das?

quant
quelle
9
pandasverwendet objectdtype frei, wenn Spalten gemischte Werte enthalten (Strings, Zahlen, Nan).
hpaulj
@quant es bedeutet Pandas String, wie ich versucht habe, in meiner Antwort zu zeigen
Prosti

Antworten:

106

Es bedeutet:

'O'     (Python) objects

Quelle .

Das erste Zeichen gibt die Art der Daten an, und die verbleibenden Zeichen geben die Anzahl der Bytes pro Element an, mit Ausnahme von Unicode, wo es als Anzahl der Zeichen interpretiert wird. Die Artikelgröße muss einem vorhandenen Typ entsprechen, sonst wird ein Fehler ausgegeben. Die unterstützten Arten gehören zu einem vorhandenen Typ, oder es wird ein Fehler ausgegeben. Die unterstützten Arten sind:

'b'       boolean
'i'       (signed) integer
'u'       unsigned integer
'f'       floating-point
'c'       complex-floating point
'O'       (Python) objects
'S', 'a'  (byte-)string
'U'       Unicode
'V'       raw data (void)

Eine andere Antwort hilft bei Bedarf types.

jezrael
quelle
19

Wenn Sie dtype('O')innerhalb des Datenrahmens sehen, bedeutet dies eine Pandas-Zeichenfolge.

Was ist dtype?

Etwas, das gehört pandasoder numpyoder 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.dtypedafür.

Das Datentypobjekt ist eine Instanz einer numpy.dtypeKlasse, 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 dtypegehö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.nanoder Nonedies 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.nanoder Nonenicht die Spalten ändern dtype, es sei denn , wir die alle Spaltenzeilen gesetzt np.nanoder None. In diesem Fall Spalte werden float64oder objectsind.

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.

Prosti
quelle
14

Es bedeutet "ein Python-Objekt", dh nicht einer der eingebauten Skalartypen, die von numpy unterstützt werden.

np.array([object()]).dtype
=> dtype('O')
shx2
quelle
6

'O' steht für Objekt .

#Loading a csv file as a dataframe
import pandas as pd 
train_df = pd.read_csv('train.csv')
col_name = 'Name of Employee'

#Checking the datatype of column name
train_df[col_name].dtype

#Instead try printing the same thing
print train_df[col_name].dtype

Die erste Zeile gibt Folgendes zurück: dtype('O')

Die Zeile mit der print-Anweisung gibt Folgendes zurück: object

Jeru Luke
quelle