Cuando vea dtype('O')
dentro del marco de datos, esto significa cadena Pandas.
¿Qué es dtype
?
¿Algo que pertenece a pandas
o 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.dtype
para eso.
El objeto de tipo de datos es una instancia de numpy.dtype
clase 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 dtype
pertenece 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.nan
o None
esto 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.nan
o None
no cambiará las columnas dtype
, a menos que establezcamos todas las filas de columnas en np.nan
o None
. En ese caso, la columna se convertirá en float64
o object
respectivamente.
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
.
pandas
utiliza librementeobject
dtype cuando las columnas contienen valores mixtos (cadenas, números, nan).