Table of Contents
Introducción
Comenzamos con el cuarto y último artículo de nuestra saga de entrenamiento con Pandas. En este artículo vamos a hacer un resumen de las diferentes funciones que se utilizan en Pandas para realizar el tratamiento de los datos perdidos. El tratamiento de los datos perdidos es clave y un reto habitual en el día a día del trabajo de ciencia de datos, y tiene un impacto directo sobre el rendimiento de los algoritmos.
Datos que faltan
Antes de empezar, vamos a visualizar un poco el dataset de ejemplo que vamos a seguir para explicar las funciones. Es un dataset creado por nosotros que incluye varios casos de uso para poder tratar con claridad todos los ejemplos que llamaremos `uncompleted_data`.
Es importante aclarar qué es un dato que falta o cómo se identifica. Tenemos diferentes valores para esto:
+ Nan en matrices numéricas
+ Nada o NaN en matrices de objetos
+ Nat en objetos datetime
Isna
Comenzamos con la función isna(). Esta función toma un objeto escalar o tipo array e indica si faltan valores. Para la entrada escalar, devuelve un booleano escalar. Para la entrada de un array, devuelve un array de booleanos indicando si falta cada elemento correspondiente.
En este caso vamos a detectar los valores que faltan en la columna «uno» utilizando la función `isna()`:
uncompleted_data['one'].isna()
a False
b False
c False
d True
e False
f False
g True
h False
Name: one, dtype: bool
Notna
Continuamos con la función notna(). Esta función toma un objeto escalar o tipo array e indica si los valores son válidos (no faltan). Para la entrada escalar, devuelve un booleano escalar. Para la entrada de un array, devuelve un array de booleanos indicando si cada elemento correspondiente es válido. En pocas palabras, es la operación inversa de isna().
Por ejemplo, vamos a detectar los valores que faltan en la columna «uno» utilizando la función `notna()`:
uncompleted_data['one'].notna()
a True
b True
c True
d False
e True
f True
g False
h True
Name: one, dtype: bool
Presta atención al hecho de que isna() y notna() son totalmente opuestas dependiendo de la funcionalidad que quieras conseguir, y lo que tienen en común es que ambas devuelven un boolean.
Fillna
Esta función es una de las más utilizadas en la limpieza de datos, ya que es útil para la búsqueda y sustitución de los valores considerados como ausentes.
Vamos a mostrar dos ejemplos muy comunes de sustituciones. El primero es para reemplazar por un valor específico pasado como argumento y el segundo es para un valor calculado del conjunto de datos como la media. También podríamos rellenar con otros valores como la moda.
+ Sustituir los valores que faltan por 0:
uncompleted_data['one'].fillna(0)
a 0.743352
b -1.349393
c 1.461743
d 0.000000
e -0.149122
f -0.601538
g 0.000000
h -0.898242
Name: one, dtype: float64
+ Sustituir los valores perdidos por la media:
uncompleted_data['one'].fillna(uncompleted_data['one'].mean())
a 0.743352
b -1.349393
c 1.461743
d -0.132200
e -0.149122
f -0.601538
g -0.132200
h -0.898242
Name: one, dtype: float64
Dropna
Esta función se utiliza para eliminar las filas o columnas que contienen valores perdidos. Esta función eliminará todas las filas que contengan algún valor ausente en cualquiera de las columnas.
+ Eliminar las filas que contienen valores perdidos:
uncompleted_data.dropna(axis=0)
+ Eliminar las columnas que contienen valores perdidos:
uncompleted_data.dropna(axis=1)
Interpolate
Esta función se utiliza para reemplazar los valores perdidos utilizando un método de interpolación. La interpolación es un tipo de estimación, un método para construir (encontrar) nuevos puntos de datos basados en el rango de un conjunto discreto de puntos de datos conocidos.
En este ejemplo vamos a reemplazar los valores perdidos de la columna `uno` utilizando el método de interpolación `lineal` por defecto.
Fig. 1. Impresión de datos antes y después de la interpolación. La función de interpolación genera datos siguiendo un patrón dentro del rango de datos conocidos.
+ Después
uncompleted_data['one'].interpolate()
Replace
Esta función, como su nombre indica, se utiliza para sustituir un valor por otro, pero en este caso vamos a explicar uno de sus usos más útiles. Se basa en el uso de esta función en combinación con expresiones regulares.
En este ejemplo vamos a sustituir por np.nan todos los valores que estén dentro del rango [0,1):
to_replace.replace(r"^0\.[0-9]*", np.nan, regex=True)
a NaN
b -1.349393388281627
c 1.4617427030378465
d nan
e -0.1491215416722299
f -0.6015382564614734
g nan
h -0.8982420093440403
Name: one, dtype: object
Entrenando tus habilidades
Si quieres llevar tus habilidades un paso más en Ciencia de Datos, hemos creado un curso que puedes descargar gratuitamente aquí.