pandas
Tipos de datos
Buscar..
Observaciones
Los tipos no son nativos de los pandas. Son el resultado de pandas cerca del acoplamiento arquitectónico para adormecer.
el dtype de una columna no tiene que correlacionarse de ninguna manera con el tipo python del objeto contenido en la columna.
Aquí tenemos un pd.Series
. pd.Series
con flotadores. El dtype será float
.
Luego usamos astype
para " astype
" a objeto.
pd.Series([1.,2.,3.,4.,5.]).astype(object)
0 1
1 2
2 3
3 4
4 5
dtype: object
El dtype ahora es objeto, pero los objetos en la lista todavía son flotantes. Lógico si sabes que en Python, todo es un objeto, y se puede actualizar al objeto.
type(pd.Series([1.,2.,3.,4.,5.]).astype(object)[0])
float
Aquí intentamos "echar" las carrozas a las cuerdas.
pd.Series([1.,2.,3.,4.,5.]).astype(str)
0 1.0
1 2.0
2 3.0
3 4.0
4 5.0
dtype: object
El dtype ahora es objeto, pero el tipo de las entradas en la lista es cadena. Esto se debe a que numpy
no se ocupa de las cadenas y, por lo tanto, actúa como si solo fueran objetos y no preocupa.
type(pd.Series([1.,2.,3.,4.,5.]).astype(str)[0])
str
No confíe en los tipos, son un artefacto de un defecto arquitectónico en los pandas. Especifíquelos como debe, pero no confíe en el tipo de dtype establecido en una columna.
Comprobando los tipos de columnas
Los tipos de columnas se pueden verificar mediante .dtypes
atrribute of DataFrames.
In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0], 'C': [True, False, True]})
In [2]: df
Out[2]:
A B C
0 1 1.0 True
1 2 2.0 False
2 3 3.0 True
In [3]: df.dtypes
Out[3]:
A int64
B float64
C bool
dtype: object
Para una sola serie, puede usar el atributo .dtype
.
In [4]: df['A'].dtype
Out[4]: dtype('int64')
Cambiando dtypes
astype()
método astype()
cambia el tipo de letra de una serie y devuelve una nueva serie.
In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0],
'C': ['1.1.2010', '2.1.2011', '3.1.2011'],
'D': ['1 days', '2 days', '3 days'],
'E': ['1', '2', '3']})
In [2]: df
Out[2]:
A B C D E
0 1 1.0 1.1.2010 1 days 1
1 2 2.0 2.1.2011 2 days 2
2 3 3.0 3.1.2011 3 days 3
In [3]: df.dtypes
Out[3]:
A int64
B float64
C object
D object
E object
dtype: object
Cambie el tipo de columna A a flotante y el tipo de columna B a entero:
In [4]: df['A'].astype('float')
Out[4]:
0 1.0
1 2.0
2 3.0
Name: A, dtype: float64
In [5]: df['B'].astype('int')
Out[5]:
0 1
1 2
2 3
Name: B, dtype: int32
astype()
método astype()
es para conversión de tipo específico (es decir, puede especificar .astype(float64')
, .astype(float32)
o .astype(float16)
). Para la conversión general, puede usar pd.to_numeric
, pd.to_datetime
y pd.to_timedelta
.
Cambiando el tipo a numérico
pd.to_numeric
cambia los valores a un tipo numérico.
In [6]: pd.to_numeric(df['E'])
Out[6]:
0 1
1 2
2 3
Name: E, dtype: int64
De forma predeterminada, pd.to_numeric
genera un error si una entrada no se puede convertir en un número. Puedes cambiar ese comportamiento usando el parámetro de errors
.
# Ignore the error, return the original input if it cannot be converted
In [7]: pd.to_numeric(pd.Series(['1', '2', 'a']), errors='ignore')
Out[7]:
0 1
1 2
2 a
dtype: object
# Return NaN when the input cannot be converted to a number
In [8]: pd.to_numeric(pd.Series(['1', '2', 'a']), errors='coerce')
Out[8]:
0 1.0
1 2.0
2 NaN
dtype: float64
Si es necesario, compruebe que todas las filas con entrada no se pueden convertir a boolean indexing
uso numérico con isnull
:
In [9]: df = pd.DataFrame({'A': [1, 'x', 'z'],
'B': [1.0, 2.0, 3.0],
'C': [True, False, True]})
In [10]: pd.to_numeric(df.A, errors='coerce').isnull()
Out[10]:
0 False
1 True
2 True
Name: A, dtype: bool
In [11]: df[pd.to_numeric(df.A, errors='coerce').isnull()]
Out[11]:
A B C
1 x 2.0 False
2 z 3.0 True
Cambiando el tipo a datetime
In [12]: pd.to_datetime(df['C'])
Out[12]:
0 2010-01-01
1 2011-02-01
2 2011-03-01
Name: C, dtype: datetime64[ns]
Tenga en cuenta que 2.1.2011 se convierte al 1 de febrero de 2011. Si desea el 2 de enero de 2011, debe utilizar el parámetro dayfirst
.
In [13]: pd.to_datetime('2.1.2011', dayfirst=True)
Out[13]: Timestamp('2011-01-02 00:00:00')
Cambiando el tipo a timedelta
In [14]: pd.to_timedelta(df['D'])
Out[14]:
0 1 days
1 2 days
2 3 days
Name: D, dtype: timedelta64[ns]
Seleccionando columnas basadas en dtype
select_dtypes
método select_dtypes
se puede utilizar para seleccionar columnas basadas en dtype.
In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0], 'C': ['a', 'b', 'c'],
'D': [True, False, True]})
In [2]: df
Out[2]:
A B C D
0 1 1.0 a True
1 2 2.0 b False
2 3 3.0 c True
Con los parámetros de include
y exclude
, puede especificar qué tipos desea:
# Select numbers
In [3]: df.select_dtypes(include=['number']) # You need to use a list
Out[3]:
A B
0 1 1.0
1 2 2.0
2 3 3.0
# Select numbers and booleans
In [4]: df.select_dtypes(include=['number', 'bool'])
Out[4]:
A B D
0 1 1.0 True
1 2 2.0 False
2 3 3.0 True
# Select numbers and booleans but exclude int64
In [5]: df.select_dtypes(include=['number', 'bool'], exclude=['int64'])
Out[5]:
B D
0 1.0 True
1 2.0 False
2 3.0 True
Resumiendo dtypes
get_dtype_counts
método get_dtype_counts
se puede usar para ver un desglose de los tipos.
In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0], 'C': ['a', 'b', 'c'],
'D': [True, False, True]})
In [2]: df.get_dtype_counts()
Out[2]:
bool 1
float64 1
int64 1
object 1
dtype: int64