Clasificación Eficiente de Datos en Pandas: Una Guía Práctica
Introducción
La clasificación de datos es una tarea común en el análisis de datos, que generalmente requiere múltiples pasos: realizar cálculos en columnas existentes, crear nuevas columnas derivadas y luego categorizar valores según condiciones específicas. Esta guía demuestra cómo realizar estas operaciones de manera eficiente usando pandas y numpy.
El Desafío
Los enfoques tradicionales suelen involucrar:
- Iterar a través de filas usando bucles (ineficiente)
- Múltiples declaraciones if-else (código desordenado)
- Operaciones separadas para cálculos y clasificaciones (código verboso)
La Solución: Operaciones Vectorizadas
1. Configuración Básica
import pandas as pd
import numpy as np
df = pd.DataFrame({
'columna1': [10, 20, 30, 40, 50],
'columna2': [1, 2, 3, 4, None]
})
2. Realizar Cálculos
En lugar de iterar a través de filas, usar operaciones vectorizadas de pandas:
df['columna3'] = df['columna1'] / df['columna2']
Esta única línea realiza el cálculo para todas las filas simultáneamente, manejando valores NULL automáticamente.
3. Métodos de Clasificación
Método 1: numpy.select()
condiciones = [
df['columna3'].isna(), # Verificar None/NaN
(df['columna3'] < 10), # Menor que 10
(df['columna3'].between(10, 20)), # Entre 10 y 20
(df['columna3'] > 20) # Mayor que 20
]
opciones = ['Faltante', 'Bajo', 'Medio', 'Alto']
df['estado'] = np.select(condiciones, opciones, default='Desconocido')
Ventajas:
- Maneja condiciones complejas
- Manejo explícito de valores NULL
- Mapeo flexible de opciones
- Operación única para todas las filas
Método 2: pandas.cut()
df['estado'] = pd.cut(df['columna3'],
bins=[-np.inf, 10, 20, np.inf],
labels=['Bajo', 'Medio', 'Alto'])
Ventajas:
- Sintaxis concisa
- Perfecto para clasificaciones basadas en rangos
- Maneja automáticamente los límites de intervalos
- Soporte integrado para matemática de intervalos
Consideraciones de Rendimiento
- Ambos métodos usan operaciones vectorizadas, haciéndolos significativamente más rápidos que los bucles
- Para grandes conjuntos de datos (millones de filas),
np.select()
ypd.cut()
tienen rendimiento similar - El uso de memoria está optimizado ya que las operaciones se realizan in situ
Mejores Prácticas
- Siempre usar operaciones vectorizadas en lugar de bucles
- Elegir
np.select()
cuando:
- Necesitas condiciones complejas
- El manejo de NULL es importante
- Las condiciones no son puramente basadas en rangos
- Elegir
pd.cut()
cuando:
- Las clasificaciones son estrictamente basadas en rangos
- Necesitas manejo automático de límites de intervalos
- Los intervalos deben ser de tamaño igual
Errores Comunes a Evitar
- No usar
.apply()
o bucles para estas operaciones - Asegurar que las condiciones en
np.select()
sean mutuamente excluyentes - Manejar valores NULL de forma explícita
- Tener cuidado con las comparaciones de punto flotante
Conclusión
Al aprovechar las operaciones vectorizadas de pandas y numpy, puedes realizar cálculos y clasificaciones complejas de manera eficiente en una sola operación. Este enfoque no solo mejora el rendimiento sino que también hace que tu código sea más mantenible y legible.