O que é dtype ('O'), em pandas?

106

Eu tenho um dataframe no pandas e estou tentando descobrir quais são os tipos de seus valores. Não tenho certeza de qual é o tipo de coluna 'Test'. No entanto, quando corro myFrame['Test'].dtype, consigo;

dtype('O')

O que isto significa?

quant
fonte
9
pandasusa livremente objectdtype quando as colunas contêm valores mistos (strings, números, nan).
hpaulj 01 de
@quant significa pandas string como tentei apontar na minha resposta
prosti

Respostas:

107

Isso significa:

'O'     (Python) objects

Fonte .

O primeiro caractere especifica o tipo de dados e os caracteres restantes especificam o número de bytes por item, exceto para Unicode, onde é interpretado como o número de caracteres. O tamanho do item deve corresponder a um tipo existente ou um erro será gerado. Os tipos suportados são para um tipo existente ou um erro será gerado. Os tipos suportados são:

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

Outra resposta ajuda se necessário, verifique type.

jezrael
fonte
19

Quando você vê dtype('O')dentro do dataframe, isso significa string Pandas.

O que é dtype?

Algo que pertence a pandasou numpy, ou ambos, ou outra coisa? Se examinarmos o código do pandas:

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

A saída será assim:

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

Você pode interpretar o último como Pandas dtype('O')ou objeto Pandas que é string do tipo Python, e isso corresponde a Numpy string_, ou unicode_tipos.

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

Como Don Quixote está na bunda, o Pandas está no Numpy e o Numpy entende a arquitetura subjacente do seu sistema e usa a classe numpy.dtypepara isso.

O objeto de tipo de dados é uma instância de numpy.dtypeclasse que entende o tipo de dados de forma mais precisa, incluindo:

  • Tipo de dados (inteiro, flutuante, objeto Python, etc.)
  • Tamanho dos dados (quantos bytes existem, por exemplo, o inteiro)
  • Ordem dos bytes dos dados (little-endian ou big-endian)
  • Se o tipo de dados for estruturado, um agregado de outros tipos de dados, (por exemplo, descrevendo um item de matriz consistindo em um inteiro e um flutuante)
  • Quais são os nomes dos "campos" da estrutura
  • Qual é o tipo de dados de cada campo
  • Qual parte do bloco de memória cada campo leva
  • Se o tipo de dados é uma submatriz, qual é sua forma e tipo de dados

No contexto desta questão dtypepertence a ambos pands e numpy e, em particular, dtype('O')significa que esperamos a string.


Aqui está algum código para teste com explicação: Se tivermos o conjunto de dados como dicionário

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)

As últimas linhas examinarão o dataframe e observarão a saída:

   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

Todo tipo de diferente dtypes

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

Mas se tentarmos definir np.nanou Noneisso não afetará o tipo de coluna original. A saída será assim:

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

Portanto, np.nanou Nonenão mudará as colunas dtype, a menos que definamos todas as linhas da coluna como np.nanou None. Nesse caso, a coluna se tornará float64ou objectrespectivamente.

Você também pode tentar definir linhas únicas:

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

E para notar aqui, se definirmos string dentro de uma coluna não string, ela se tornará string ou objeto dtype.

Prosti
fonte
14

Significa "um objeto python", ou seja, não é um dos tipos escalares integrados suportados por numpy.

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

'O' significa objeto .

#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

A primeira linha retorna: dtype('O')

A linha com a instrução de impressão retorna o seguinte: object

Jeru Luke
fonte