Python

Limpieza de datos con Pyjanitor: Optimizando los flujos de trabajo

Contar con unos datos de calidad es clave para que los resultados de un análisis de datos sean válidos. Sin embargo, en la mayoría de las ocasiones, los conjuntos de datos suelen tener múltiples problemas de calidad. Por ejemplo, la presencia de valores nulos, nombres de columnas no estandarizados y datos mal formateados. En esta entrada se analizará las opciones existentes para la limpieza de datos con Pyjanitor. Una biblioteca que ofrece métodos para hacer más fácil este proceso.

En esta entrada es parte de una serie sobre la biblioteca Pyjanitor, el resto de las publicaciones son:

  1. Introducción a Pyjanitor
  2. Limpieza de datos con Pyjanitor
  3. Transformación de datos con Pyjanitor
  4. Visualización de datos con Pyjanitor y Matplotlib o Seaborn

Carga de datos de ejemplo

Antes de comenzar, es necesario importar un conjunto de datos de ejemplo que cuente con varios problemas de los que puede solucionar Pyjanitor. Por ejemplo, el conjunto de datos clásico como los del Titanic. Un conjunto de datos contiene información sobre los pasajeros del famoso barco Titanic, incluyendo detalles como edad, género, clase de pasajero y si sobrevivieron o no. Para facilitar el seguimiento de los ejemplos, los datos se pueden cargar directamente desde una URL utilizando la biblioteca Pandas:

import pandas as pd

# URL del nuevo conjunto de datos de ventas
url = 'https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv'

# Cargar el conjunto de datos en un DataFrame
titanic = pd.read_csv(url)

# Mostrar las primeras filas del DataFrame para verificar la carga exitosa
titanic.head()
   PassengerId  Survived  Pclass  \
0 1 0 3
1 2 1 1
2 3 1 3
3 4 1 1
4 5 0 3

Name Sex Age SibSp \
0 Braund, Mr. Owen Harris male 22.0 1
1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1
2 Heikkinen, Miss. Laina female 26.0 0
3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1
4 Allen, Mr. William Henry male 35.0 0

Parch Ticket Fare Cabin Embarked
0 0 A/5 21171 7.2500 NaN S
1 0 PC 17599 71.2833 C85 C
2 0 STON/O2. 3101282 7.9250 NaN S
3 0 113803 53.1000 C123 S
4 0 373450 8.0500 NaN S

Una vez cargados los datos, se puede comenzar a explorar algunas técnicas de limpieza de datos utilizando Pyjanitor.

Limpiar nombres de columnas

Los nombres de las columnas inconsistentes o mal formateadas de los conjuntos de datos pueden dificultar los procesos de análisis de datos. Provocando la aparición de errores a la hora de referenciar una columna en concreto. Veamos cómo se puede limpiar los nombres de las columnas en el conjunto de datos de Titanic:

import janitor

# Limpiar nombres de columnas
titanic_cleaned_names = titanic.clean_names()

# Mostrar los nombres de las columnas limpiados
print(titanic_cleaned_names.columns)
Index(['passengerid', 'survived', 'pclass', 'name', 'sex', 'age', 'sibsp',
'parch', 'ticket', 'fare', 'cabin', 'embarked'],
dtype='object')

En este ejemplo, se ha empleado el método clean_names() de Pyjanitor para estandarizar los nombres de las columnas del conjunto de datos. Modificando estos para que tengan una notación homogénea y coherente. Al aplicar el método, todos los nombres de las columnas se convierten a minúsculas y se reemplaza los espacios en blanco con guiones bajos, lo que facilita tanto el acceso a las columnas, como mejora la legibilidad del código.

Manejo de valores nulos

Uno de los problemas más comunes en los conjuntos de datos es la presencia de valores nulos. La primera opción puede ser la eliminación de los registros que cuenta con algún valor nulo, lo que en Pandas se puede conseguir con el método dropna(). Aunque, como se ve en el siguiente código, para el conjunto de datos de Titanic esto es un problema ya que la mayoría de los registros cuentan con algún valor nulo y, por lo tanto, los registros que quedan son una pequeña fracción de los originales.

# Eliminar filas con valores nulos
titanic_no_nan = titanic_cleaned_names.dropna()

# Mostrar el número de filas antes y después de la limpieza
print("Número de filas antes de la limpieza:", len(titanic_cleaned_names))
print("Número de filas después de la limpieza:", len(titanic_no_nan))
Número de filas antes de la limpieza: 891
Número de filas después de la limpieza: 183

A modo de ejemplo, se pueden ver los registros que no cuentan con la edad del pasajero.

# Identificar los resgistros sin edad
titanic_no_age = titanic_cleaned_names.isna().age

# Mostrar los primeros registros sin edad
print(titanic_cleaned_names[titanic_no_age].head())
    passengerid  survived  pclass                           name     sex  age  \
5 6 0 3 Moran, Mr. James male NaN
17 18 1 2 Williams, Mr. Charles Eugene male NaN
19 20 1 3 Masselmani, Mrs. Fatima female NaN
26 27 0 3 Emir, Mr. Farred Chehab male NaN
28 29 1 3 O'Dwyer, Miss. Ellen "Nellie" female NaN

sibsp parch ticket fare cabin embarked
5 0 0 330877 8.4583 NaN Q
17 0 0 244373 13.0000 NaN S
19 0 0 2649 7.2250 NaN C
26 0 0 2631 7.2250 NaN C
28 0 0 330959 7.8792 NaN Q

Otro enfoque común para tratar los valores nulos es rellenarlos con valores específicos. Pyjanitor cuenta con el método impute() que permite agregar un valor dado a una columna. Por ejemplo, se puede agregar el valor 30 a los registros que no cuentan con un dato de edad.

# Rellenar valores nulos con un valor constante
titanic_age_filled = titanic_cleaned_names.impute(column_names="age",
                                                  value=30)

# Mostrar el resultado
print(titanic_age_filled[titanic_no_age].head())
    passengerid  survived  pclass                           name     sex  \
5 6 0 3 Moran, Mr. James male
17 18 1 2 Williams, Mr. Charles Eugene male
19 20 1 3 Masselmani, Mrs. Fatima female
26 27 0 3 Emir, Mr. Farred Chehab male
28 29 1 3 O'Dwyer, Miss. Ellen "Nellie" female

age sibsp parch ticket fare cabin embarked
5 30.0 0 0 330877 8.4583 NaN Q
17 30.0 0 0 244373 13.0000 NaN S
19 30.0 0 0 2649 7.2250 NaN C
26 30.0 0 0 2631 7.2250 NaN C
28 30.0 0 0 330959 7.8792 NaN Q

En este ejemplo se ha llamado al método impute() indicando tanto la columnas que se desea rellenar como el valor que se desea usar. Un enfoque más avanzado puede ser rellenar los valores nulos con la media de la columna. Algo que se pude conseguir mediante indicando la operación en la propiedad ‌statistic_column_name como se muestra a continuación.

# Rellenar valores nulos con el valor medio de la columna
titanic_age_filled = titanic_cleaned_names.impute(column_names="age",
                                                  statistic_column_name="mean")

# Mostrar el resultado
print(titanic_age_filled[titanic_no_age].head())
    passengerid  survived  pclass                           name     sex  \
5 6 0 3 Moran, Mr. James male
17 18 1 2 Williams, Mr. Charles Eugene male
19 20 1 3 Masselmani, Mrs. Fatima female
26 27 0 3 Emir, Mr. Farred Chehab male
28 29 1 3 O'Dwyer, Miss. Ellen "Nellie" female

age sibsp parch ticket fare cabin embarked
5 29.699118 0 0 330877 8.4583 NaN Q
17 29.699118 0 0 244373 13.0000 NaN S
19 29.699118 0 0 2649 7.2250 NaN C
26 29.699118 0 0 2631 7.2250 NaN C
28 29.699118 0 0 330959 7.8792 NaN Q

Conclusiones

En esta entrada, se han analizado las opciones que están disponibles para la limpieza de datos con Pyjanitor. Viendo como estas pueden optimizar los flujos de trabajo para cualquier análisis de datos.

En la próxima entrada se explicará en detalle los métodos que ofrece Pyjanitor para la transformación de datos en Python.

Imagen de Ryan McGuire en Pixabay

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez

Recent Posts

Data Lake y Data Warehouse: diferencias, usos y cómo se complementan en la era del dato

En la era del dato, las organizaciones se enfrentan al reto de gestionar volúmenes masivos…

2 días ago

Documentar tu API de Express con TypeScript usando OpenAPI (Swagger)

En la serie Creación de una API REST con Express y TypeScript construimos una API…

4 días ago

Curiosidad: El sesgo de supervivencia, o por qué prestar atención sólo a los que “llegaron” puede engañarte

Durante la Segunda Guerra Mundial, la Fuerza Aérea de Estados Unidos quería reforzar sus aviones…

1 semana ago

Cómo abrir una ventana de Chrome con tamaño y posición específicos desde la línea de comandos en Windows

En muchas situaciones —ya sea para grabar un tutorial, tomar capturas de pantalla profesionales, probar…

2 semanas ago

La Paradoja del Cumpleaños, o por qué no es tan raro compartir fecha de nacimiento

Imagínate en una sala con un grupo de personas, por ejemplo, en una oficina, un…

2 semanas ago

Programador de tareas de Windows: Guía definitiva para automatizar tu trabajo (BAT, PowerShell y Python)

En el trabajo diario con ordenadores, es común encontrarse con tareas repetitivas: realizar copias de…

3 semanas ago

This website uses cookies.