Lección 11 de 29Módulo 2: Pandas - Manipulación de Datos

11. Agrupación y Agregación

GroupBy, pivot tables y agregaciones complejas

25 minutos

Domina GroupBy, pivot tables y agregaciones complejas para generar insights profundos de tus datos.

GroupBy avanzado

import pandas as pd
import numpy as np

# Dataset de ventas complejo
ventas = pd.DataFrame({
    'fecha': pd.date_range('2024-01-01', periods=500, freq='H'),
    'producto': np.random.choice(['Laptop', 'Mouse', 'Teclado', 'Monitor'], 500),
    'categoria': np.random.choice(['Computadoras', 'Accesorios', 'Monitores'], 500),
    'region': np.random.choice(['Norte', 'Sur', 'Este', 'Oeste'], 500),
    'vendedor': np.random.choice(['Ana', 'Carlos', 'María', 'Luis'], 500),
    'cantidad': np.random.randint(1, 10, 500),
    'precio': np.random.choice([25, 60, 300, 800], 500)
})

ventas['total'] = ventas['cantidad'] * ventas['precio']

# Agregación múltiple
resumen = ventas.groupby('producto').agg({
    'total': ['sum', 'mean', 'count', 'std'],
    'cantidad': ['sum', 'mean'],
    'precio': ['mean', 'min', 'max']
}).round(2)

print(resumen)

# GroupBy con funciones personalizadas
def rango(serie):
    return serie.max() - serie.min()

custom_agg = ventas.groupby('producto')['total'].agg([
    ('total', 'sum'),
    ('promedio', 'mean'),
    ('rango', rango),
    ('transacciones', 'count')
])

print(custom_agg)

# Multiple groupby
por_region_producto = ventas.groupby(['region', 'producto'])['total'].sum().unstack(fill_value=0)
print(por_region_producto)

Pivot Tables avanzadas

# Pivot table completa
pivot = ventas.pivot_table(
    values='total',
    index='region',
    columns='producto',
    aggfunc='sum',
    margins=True,           # Totales
    margins_name='TOTAL',
    fill_value=0
)

print(pivot)

# Múltiples valores
pivot_multi = ventas.pivot_table(
    values=['total', 'cantidad'],
    index='region',
    columns='producto',
    aggfunc={'total': 'sum', 'cantidad': 'mean'}
)

# Múltiples funciones de agregación
pivot_funciones = ventas.pivot_table(
    values='total',
    index='region',
    columns='producto',
    aggfunc=['sum', 'mean', 'count']
)

Transformaciones por grupo

# Calcular porcentaje del total por grupo
ventas['pct_del_total_producto'] = ventas.groupby('producto')['total'].transform(
    lambda x: (x / x.sum()) * 100
)

# Ranking dentro de cada grupo
ventas['rank_en_region'] = ventas.groupby('region')['total'].rank(ascending=False)

# Diferencia con la media del grupo
ventas['diff_vs_media'] = ventas.groupby('producto')['total'].transform(
    lambda x: x - x.mean()
)

# Acumulado por grupo
ventas_ordenadas = ventas.sort_values(['producto', 'fecha'])
ventas_ordenadas['acumulado_producto'] = ventas_ordenadas.groupby('producto')['total'].cumsum()

Resumen de la lección

groupby().agg() permite múltiples agregaciones simultáneas ✅ pivot_table() crea tablas dinámicas como Excel ✅ transform() aplica función manteniendo la forma original ✅ Agregaciones personalizadas con funciones lambda o definidas ✅ unstack() convierte índices en columnas


🎯 Próxima lección: 12. Introducción a Matplotlib

¡Completaste el módulo de Pandas! Ahora comenzarás con visualización de datos. 🚀

¿Completaste esta lección?

Marca esta lección como completada. Tu progreso se guardará en tu navegador.