Aprende a unificar y corregir categorías en Python con Pandas y Numpy

El caso es el siguiente, tienes un set de datos de pruebas con unas variables categóricas tienen las siguientes características:

  • Existem demasiados valores únicos en las columnas categóricas, lo que dificulta usarlas en gráficas o análisis generales, por lo que deseas unificarlas. Piensa por ejemplo que tienes  en una columna los valores: chocolatinas, dulces, chicles y bombones, pero quieres que todas sean consolidadas en una columna como "dulces".
  • Al hacer la exploración, encuentras muchos errores de escritura o sinónimos en una columna y debes unificar estas categorías para evitar problemas en los análisis, por ejemplo tienes chocolates, chocolatina, chocolate, choclat, chocolat y todos deben quedar como "Chocolate".
En estos casos podemos usar Python, y combinar Pandas y Numpy para lograr esto. Para ello comencemos por instalar las librerías:
pip install pandas
pip install numpy
Ahora usaremos un set de datos de prueba del portal de datos abiertos:
# Datos de prueba
dfDatos = pd.read_csv('https://www.datos.gov.co/api/views/jdjx-jx6d/rows.csv')
Este set de datos tiene un campo "PRODUCTOSELABORADOS" que es el que usaremos para generar una nueva categoría ya que tiene un texto demasiado largo:
Para reemplazar usaremos la la función select de numpy:
np.select(listaCondiciones,listaOpciones,default=datoPorDefecto)
Esta función tiene estos parámetros:
  • listaCondiciones: Es unalista con las condiciones que se evaluaran para realizar el reemplazo, las condiciones tienen la siguiente estructura:
(dfDatos['PRODUCTOSELABORADOS'].str.contains('LECHE|LACTEO|YOGU|QUES'))
Lo importante es tener presente que la función contains cuando se adiciona el caracter "|" implica que se busca alguno de las cadenas de texto que se ponen, así LECHE|LACTEO quiere decir que buscará si el texto contiene LECHE o LACTEO

  • listaOpciones:  Es la lista de textos que deben retornarse si se cumple la condición que está en la misma posición de la lista de condiciones. En el código de abajo veremos que para esta condición tenemos el texto "LACTEOS"
Es importante que tanto la lista de condiciones como la de opciones tengan la misma longitud o la función sacará error:
  • default: Este parámetro es el que se retorna si ninguna de las condiciones aplica, puede ser una cadena de texto o se pueden usar algún campo del dataframe.
El siguiente ejemplo aplicará varias condiciones para generar una nueva columna con los nuevos grupos de categorías.

#Condiciones de reemplazo a aplicar
condiciones = [(dfDatos['PRODUCTOSELABORADOS'].str.contains('LECHE|LACTEO|YOGU|QUES')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('MEZCLA')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('BEBIDA|AGUA|MALTA')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('CHOCOLATE')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('CAFÉ|CAFE')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('SALSA')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('PAN|TORTA|GALLET')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('HELAD')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('DULC|CARAMELOS|BOCADILLO')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('PASTAS')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('GRANOLA|CEREAL')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('CARNE')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('GOMA'))]
#Opciones por las que se debe reemplazar cuando cada condición se cumple
opciones = ['LACTEOS','MEZCLAS','BEBIDAS','CHOCOLATE','CAFÉ','SALSAS','PANADERIA','HELADS','DULCES','PASTAS','CEREALES','CARNES','GOMAS']

#Aplicar los cambios en el campo nuevo Grupo
dfDatos['NUEVO_GRUPO']= np.select(condiciones,opciones,default=dfDatos['PRODUCTOSELABORADOS'])
Esta sería una muestra del resultado:
Con este simple proceso podras crear nuevas columnas agrupadas, corregir nombres de categoría mal escritos y en general llevar diferentes datos de una columna de texto a uno solo que necesites para tu análisis. Este código lo puedes copiar y pegar en Jupyter Notebook para que lo puedas probar por completo:



# Importamos las librerías
import numpy as np
import pandas as pd

# Cargamos el dataframe
dfDatos = pd.read_csv('https://www.datos.gov.co/api/views/jdjx-jx6d/rows.csv')

#Validamos los datos
dfDatos['PRODUCTOSELABORADOS']


#Condiciones de reemplazo a aplicar
condiciones = [(dfDatos['PRODUCTOSELABORADOS'].str.contains('LECHE|LACTEO|YOGU|QUES')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('MEZCLA')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('BEBIDA|AGUA|MALTA')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('CHOCOLATE')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('CAFÉ|CAFE')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('SALSA')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('PAN|TORTA|GALLET')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('HELAD')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('DULC|CARAMELOS|BOCADILLO')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('PASTAS')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('GRANOLA|CEREAL')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('CARNE')),
               (dfDatos['PRODUCTOSELABORADOS'].str.contains('GOMA'))]
#Opciones por las que se debe reemplazar cuando cada condición se cumple
opciones = ['LACTEOS','MEZCLAS','BEBIDAS','CHOCOLATE','CAFÉ','SALSAS','PANADERIA','HELADS','DULCES','PASTAS','CEREALES','CARNES','GOMAS']

#Aplicar los cambios en el campo nuevo Grupo
dfDatos['NUEVO_GRUPO']= np.select(condiciones,opciones,default=dfDatos['PRODUCTOSELABORADOS'])

# Revisamos el resultado

dfDatos[['PRODUCTOSELABORADOS','NUEVO_GRUPO']]

Publicar un comentario

0 Comentarios