¿Qué es dtype ('O'), en pandas?

106

Tengo un marco de datos en pandas y estoy tratando de averiguar cuáles son los tipos de sus valores. No estoy seguro de cuál es el tipo de columna 'Test'. Sin embargo, cuando corro myFrame['Test'].dtype, obtengo;

dtype('O')

¿Qué significa esto?

cuantitativo
fuente
9
pandasutiliza libremente objectdtype cuando las columnas contienen valores mixtos (cadenas, números, nan).
hpaulj
@quant significa cadena de pandas como traté de señalar en mi respuesta
prosti

Respuestas:

107

Significa:

'O'     (Python) objects

Fuente .

El primer carácter especifica el tipo de datos y los caracteres restantes especifican el número de bytes por elemento, excepto para Unicode, donde se interpreta como el número de caracteres. El tamaño del artículo debe corresponder a un tipo existente o se generará un error. Los tipos admitidos corresponden a un tipo existente o se generará un error. Los tipos admitidos son:

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

Otra respuesta ayuda si es necesario comprobar types.

Jezrael
fuente
19

Cuando vea dtype('O')dentro del marco de datos, esto significa cadena Pandas.

¿Qué es dtype?

¿Algo que pertenece a pandaso numpy, o ambos, o algo más? Si examinamos el código de 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

Saldrá así:

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

Puede interpretar el último como Pandas dtype('O')o un objeto Pandas que es una cadena de tipo Python, y esto corresponde a Numpy string_, o unicode_tipos.

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

Como Don Quijote está en el culo, Pandas está en Numpy y Numpy entiende la arquitectura subyacente de su sistema y usa la clase numpy.dtypepara eso.

El objeto de tipo de datos es una instancia de numpy.dtypeclase que comprende el tipo de datos de manera más precisa, que incluye:

  • Tipo de datos (entero, flotante, objeto Python, etc.)
  • Tamaño de los datos (cuántos bytes hay en, por ejemplo, el número entero)
  • Orden de bytes de los datos (little-endian o big-endian)
  • Si el tipo de datos está estructurado, un agregado de otros tipos de datos (p. Ej., Describir un elemento de matriz que consta de un número entero y un flotante)
  • ¿Cuáles son los nombres de los "campos" de la estructura
  • ¿Cuál es el tipo de datos de cada campo?
  • Qué parte del bloque de memoria toma cada campo
  • Si el tipo de datos es una submatriz, ¿cuál es su forma y tipo de datos?

En el contexto de esta pregunta dtypepertenece tanto a pands como a numpy y, en particular, dtype('O')significa que esperamos la cadena.


Aquí hay un código para probar con una explicación: Si tenemos el conjunto de datos como diccionario

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)

Las últimas líneas examinarán el marco de datos y observarán el resultado:

   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

Pero si intentamos establecer np.nano Noneesto no afectará al tipo de columna original. La salida será así:

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

Entonces np.nano Noneno cambiará las columnas dtype, a menos que establezcamos todas las filas de columnas en np.nano None. En ese caso, la columna se convertirá en float64o objectrespectivamente.

También puede intentar configurar filas individuales:

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

Y tenga en cuenta aquí, si establecemos una cadena dentro de una columna que no es una cadena, se convertirá en una cadena u objeto dtype.

prosti
fuente
14

Significa "un objeto de Python", es decir, no uno de los tipos escalares incorporados admitidos por numpy.

np.array([object()]).dtype
=> dtype('O')
shx2
fuente
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

La primera línea devuelve: dtype('O')

La línea con la declaración de impresión devuelve lo siguiente: object

Jeru Luke
fuente