Asegurar datos numéricos
Asegurar datos numéricos#
Como vimos en la sección dedicada a tipos de datos en pandas
, los tipos de datos con los que podremos realizar operaciones son int64
y float64
. También vimos que en la mayoría de ocasiones, estos tipos pueden estar expresados en forma de tipo object
. Incluso, algunos de estos datos están en forma de string
.
Nota
Para este apartado usaré datos de ejemplo porque nuestros conjuntos de datos muestra_covid
y geolocalizacion
no necesitan una transformación adicional.
Revisa tu conjunto de datos para saber si esta es una operación necesaria o no.
Al igual que en las operaciones anteriores, pandas
incluye una función que permite convertir los datos a un tipo numérico.
import pandas as pd
s = pd.Series(["1", "2", "3", "4", "5"])
print(s.dtypes)
pd.to_numeric(s)
object
0 1
1 2
2 3
3 4
4 5
dtype: int64
Notarás que cuando llamamos a la función to_numeric
, los datos se convierten a tipo int64
y de la misma manera lo puede hacer con cualquier columna que contenga datos numéricos. Sin embargo, no puede hacerlo con todo el dataframe al mismo tiempo, por ejemplo:
df = pd.DataFrame({"A": ["Camila", "Sebastián", "Santiago", "Jimena", "Hannah"], "B": ["1.5", "1.2", "2.3", "4.5", "5.6"], "C": ["1", "2", "3", "4", "5"]})
print(df.dtypes)
pd.to_numeric(df)
A object
B object
C object
dtype: object
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/var/folders/6z/cjmzygfj49d6yzn_qgny7hgr0000gp/T/ipykernel_99193/1763755439.py in <module>
1 df = pd.DataFrame({"A": ["Camila", "Sebastián", "Santiago", "Jimena", "Hannah"], "B": ["1.5", "1.2", "2.3", "4.5", "5.6"], "C": ["1", "2", "3", "4", "5"]})
2 print(df.dtypes)
----> 3 pd.to_numeric(df)
~/opt/anaconda3/lib/python3.9/site-packages/pandas/core/tools/numeric.py in to_numeric(arg, errors, downcast)
161 values = np.array([arg], dtype="O")
162 elif getattr(arg, "ndim", 1) > 1:
--> 163 raise TypeError("arg must be a list, tuple, 1-d array, or Series")
164 else:
165 values = arg
TypeError: arg must be a list, tuple, 1-d array, or Series
Lo anterior nos arroja un TypeError
porque pandas
estaba esperando una Serie
, es decir, el conjunto de datos de una sola columna.
Para transformar estos datos podemos utilizar el método tradicional de for loop
así:
for col in df.columns:
try:
df[col] = pd.to_numeric(df[col])
except ValueError:
pass
df.dtypes
A object
B float64
C int64
dtype: object
El problema con este método es que es un poco lento. De hecho, en un conjunto de datos como covid_nacional
tomaría muchos minutos y gastaría mucha memoria, tanto que podría simplemente bloquear la computadora.
En términos de eficiencia es mejor utilizar el método de pandas
apply()
. Veremos un poco más sobre el uso de este método en la sección dedicada a apply()
, pero por lo pronto veremos un ejemplo de como usarlo.
df = pd.DataFrame({"A": ["Camila", "Sebastián", "Santiago", "Jimena", "Hannah"], "B": ["1.5", "1.2", "2.3", "4.5", "5.6"], "C": ["1", "2", "3", "4", "5"]})
cols = df.columns.drop('A') # Eliminamos la columna que sabemos tiene valores de texto
df[cols] = df[cols].apply(pd.to_numeric)
df.dtypes
A object
B float64
C int64
dtype: object
Observación
La conversión de datos numéricos, así como la de fechas, que veremos a continuación, es una operación que se realiza sobre una sola columna. Por esa razón es importante que hayas realizado previamente la identificación de tipos de datos.