Cos'è dtype ('O'), in panda?


106

Ho un dataframe in Panda e sto cercando di capire quali sono i tipi dei suoi valori. Non sono sicuro di quale sia il tipo di colonna 'Test'. Tuttavia, quando corro myFrame['Test'].dtype, ottengo;

dtype('O')

Cosa significa questo?


9
pandasusa liberamente objectdtype quando le colonne contengono valori misti (stringhe, numeri, nan).
hpaulj

@quant significa stringa di panda come ho cercato di indicare nella mia risposta
prosti

Risposte:


107

Significa:

'O'     (Python) objects

Fonte .

Il primo carattere specifica il tipo di dati e i caratteri rimanenti specificano il numero di byte per elemento, ad eccezione di Unicode, dove viene interpretato come il numero di caratteri. La dimensione dell'elemento deve corrispondere a un tipo esistente o verrà generato un errore. I tipi supportati appartengono a un tipo esistente o verrà generato un errore. I tipi supportati sono:

'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)

Un'altra risposta aiuta se necessario controllare types.


19

Quando vedi dtype('O')all'interno del dataframe questo significa stringa Pandas.

Che cos'è dtype?

Qualcosa che appartiene a pandaso numpy, o entrambi, o qualcos'altro? Se esaminiamo il codice dei panda:

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

Produrrà in questo modo:

   float  int   datetime string    
0    1.0    1 2018-03-10    foo
---
float64 int64 datetime64[ns] object
---
dtype('O')

Puoi interpretare l'ultimo come dtype('O')oggetto Pandas o Pandas che è una stringa di tipo Python, e questo corrisponde a Numpy string_, o unicode_types.

Pandas dtype    Python type     NumPy type          Usage
object          str             string_, unicode_   Text

Come Don Chisciotte è in culo, Pandas è su Numpy e Numpy capisce l'architettura sottostante del tuo sistema e usa la classe numpy.dtypeper questo.

L'oggetto del tipo di dati è un'istanza della numpy.dtypeclasse che comprende il tipo di dati più preciso, tra cui:

  • Tipo di dati (intero, float, oggetto Python, ecc.)
  • Dimensione dei dati (quanti byte sono, ad esempio, il numero intero)
  • Ordine byte dei dati (little-endian o big-endian)
  • Se il tipo di dati è strutturato, un aggregato di altri tipi di dati, (ad esempio, descrivendo un elemento di matrice costituito da un numero intero e un float)
  • Quali sono i nomi dei "campi" della struttura
  • Qual è il tipo di dati di ogni campo
  • Quale parte del blocco di memoria accetta ogni campo
  • Se il tipo di dati è un sotto-array, qual è la sua forma e il tipo di dati

Nel contesto di questa domanda dtypeappartiene sia a pands che a numpy e in particolare dtype('O')significa che ci aspettiamo la stringa.


Ecco un po 'di codice per il test con spiegazione: Se abbiamo il set di dati come dizionario

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)

Le ultime righe esamineranno il dataframe e annoteranno l'output:

   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

Tutto diverso dtypes

df.iloc[1,:] = np.nan
df.iloc[2,:] = None

Ma se proviamo a impostare np.nano Nonequesto non influirà sulla colonna originale dtype. L'output sarà così:

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

Quindi np.nano Nonenon cambierà le colonne dtype, a meno che non impostiamo tutte le righe delle colonne su np.nano None. In quel caso la colonna diventerà float64o objectrispettivamente.

Puoi provare anche a impostare singole righe:

df.iloc[3,:] = 0 # will convert datetime to object only
df.iloc[4,:] = '' # will convert all columns to object

E da notare qui, se impostiamo una stringa all'interno di una colonna non stringa, diventerà stringa o oggetto dtype.


14

Significa "un oggetto Python", cioè non uno dei tipi scalari incorporati supportati da numpy.

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

6

'O' sta per oggetto .

#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

La prima riga restituisce: dtype('O')

La riga con l'istruzione print restituisce quanto segue: object

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.