
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:
- Introducción a Pyjanitor
- Limpieza de datos con Pyjanitor
- Transformación de datos con Pyjanitor
- 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
Pregunta , puede hacer algun proceso PCA ?
La librería Pyjanitor se centra en la limpieza y preparación de datos, por lo que yo se no cuenta con funciones para realizar análisis de PCA. Para realizar PCA en Python lo mejor es usar Scikit-learn.