Este tutorial le enseñará cómo convertir una columna de pandas de objetos a tipos numéricos como enteros o flotantes. Esta es una tarea común que normalmente ejecutará durante la fase de limpieza de datos de su flujo de trabajo de adquisición de datos; típicamente cuando se armonizan los tipos de datos en una columna que contiene cifras, pero también datos no numéricos como cadenas.
Crear datos de ejemplo
Como solemos hacer, primero crearemos un DataFrame simple que puede usar para seguir.
import pandas as pd dates = pd.date_range(start="1/10/2023", periods = 5, freq = 'B' ) sales = [162, '142', 136, '134', None] campaign = pd.DataFrame (dict (dates = dates, sales = sales)) campaign.head()
Esto generará las siguientes filas de DataFrame:
2023-01-10 | 162 |
2023-01-11 | 142 |
2023-01-12 | 136 |
2023-01-13 | 134 |
2023-01-16 | Ninguno |
Veamos los tipos de datos de las columnas:
campaign.dtypes
Esto devolverá:
dates datetime64[ns] sales object dtype: object
La columna de ventas tiene tipos de datos mixtos, por lo tanto, como se esperaba, su tipo es objeto.
Nota: La columna de ventas también contiene un valor vacío, que nos gustaría reemplazar. Si ejecutamos el comando fillna() en la columna, obtendremos la siguiente excepción TypeError:
#TypeError: unsupported operand type(s) for +: 'int' and 'str'
Antes de intentar reemplazar los valores vacíos en nuestro DataFrame, primero debemos convertir la columna a valores numéricos.
Convierte la columna de pandas en números
Hay dos opciones principales para convertir una columna Series/ en números enteros o flotantes: la función pd.to_numeric y el método astype(). Como tenemos valores vacíos en nuestra columna, optaremos por pd.to_numeric.
pd.to_numeric frente a un tipo
- A diferencia de pd.to_numeric, astype() no maneja valores NAN vacíos. Para eludir esto, usamos el parámetro errors=’ignore’.
- Si bien pd.to_numeric sabe inferir el tipo de datos esperado para la conversión, al usar astype() debemos proporcionar el tipo de datos de destino como parámetro.
Usando pd.to_numeric
campaign['sales'] = pd.to_numeric(campaign['sales'], errors="raise") campaign['sales'].head()
0 162.0 1 142.0 2 136.0 3 134.0 4 NaN Name: sales, dtype: float64
Reemplazar valores vacíos
Ahora podemos reemplazar fácilmente el valor vacío en la columna de ventas por el valor promedio de la columna:
campaign['sales'] = campaign['sales'].fillna(campaign['sales'].mean()) campaign['sales'].head()
Aquí está el resultado:
0 162.0 1 142.0 2 136.0 3 134.0 4 143.5 Name: sales, dtype: float64
Convertir la columna de pandas de flotante a entero
Ahora podemos usar el método astype():
campaign['sales'] = campaign['sales'].astype('int64') campaign['sales'].head()
Y una mirada final a nuestra columna:
0 162 1 142 2 136 3 134 4 143 Name: sales, dtype: int64