Filtrado, Seleccion y GroupBy
El Poder Real de PandasFiltrar datos, seleccionar subconjuntos y agrupar para calcular metricas son las tres operaciones que vas a hacer el 80% del tiempo en analisis de datos. Esta leccion es probablemente la mas importante del curso entero.
Filtrado Avanzado
import pandas as pd
import numpy as np
# Dataset de ejemplo
np.random.seed(42)
n = 200
df = pd.DataFrame({
'vendedor': np.random.choice(['Ana', 'Carlos', 'Maria', 'Luis', 'Sofia'], n),
'region': np.random.choice(['Norte', 'Sur', 'Este', 'Oeste'], n),
'producto': np.random.choice(['Laptop', 'Tablet', 'Monitor', 'Teclado'], n),
'monto': np.random.randint(100, 5000, n),
'cantidad': np.random.randint(1, 20, n),
'fecha': pd.date_range('2025-01-01', periods=n, freq='D')
})
# Filtro simple
ventas_norte = df[df['region'] == 'Norte']
print(f"Ventas en Norte: {len(ventas_norte)}")
# Multiples condiciones con AND
ventas_altas_norte = df[(df['region'] == 'Norte') & (df['monto'] > 3000)]
print(f"Ventas altas en Norte: {len(ventas_altas_norte)}")
# Multiples condiciones con OR
laptop_o_tablet = df[(df['producto'] == 'Laptop') | (df['producto'] == 'Tablet')]
# Usando isin (mas limpio para multiples valores)
seleccion = df[df['producto'].isin(['Laptop', 'Tablet'])]
# Negacion
no_teclado = df[~(df['producto'] == 'Teclado')]
# Filtros con strings
contiene_a = df[df['vendedor'].str.contains('a', case=False)]
empieza_con = df[df['vendedor'].str.startswith('M')]
# Filtros con fechas
febrero = df[(df['fecha'] >= '2025-02-01') & (df['fecha'] < '2025-03-01')]
print(f"Ventas en febrero: {len(febrero)}")
# Filtros con query() (mas legible)
resultado = df.query('region == "Norte" and monto > 2000')
resultado2 = df.query('vendedor in ["Ana", "Carlos"] and cantidad >= 10')
GroupBy: Agrupar y Calcular
GroupBy es la operacion mas poderosa de Pandas. Te permite hacer lo que en SQL seria GROUP BY.
# Agrupar por una columna
por_region = df.groupby('region')['monto'].sum()
print("Total de ventas por region:")
print(por_region)
# Multiples agregaciones
resumen_region = df.groupby('region')['monto'].agg(['sum', 'mean', 'count', 'std'])
resumen_region.columns = ['Total', 'Promedio', 'Cantidad', 'Desv_Est']
print("\nResumen por region:")
print(resumen_region)
# Agrupar por multiples columnas
por_region_producto = df.groupby(['region', 'producto'])['monto'].sum().reset_index()
print("\nVentas por region y producto:")
print(por_region_producto.head(10))
# Agg con diferentes funciones por columna
resumen = df.groupby('vendedor').agg(
ventas_total=('monto', 'sum'),
ventas_promedio=('monto', 'mean'),
num_transacciones=('monto', 'count'),
unidades_total=('cantidad', 'sum'),
ticket_maximo=('monto', 'max')
).round(2)
print("\nResumen por vendedor:")
print(resumen.sort_values('ventas_total', ascending=False))
GroupBy con transformaciones
# transform: aplica una funcion y mantiene el mismo indice
df['promedio_region'] = df.groupby('region')['monto'].transform('mean')
df['pct_de_region'] = df['monto'] / df.groupby('region')['monto'].transform('sum') * 100
# Desviacion respecto al promedio
df['desviacion'] = df['monto'] - df.groupby('region')['monto'].transform('mean')
# Ranking dentro de cada grupo
df['ranking_region'] = df.groupby('region')['monto'].rank(ascending=False, method='min')
print(df[['vendedor', 'region', 'monto', 'promedio_region', 'ranking_region']].head(10))
Tablas Pivot
Las tablas pivot son la version avanzada de groupby, similar a tablas dinamicas de Excel.
# Tabla pivot basica
pivot = df.pivot_table(
values='monto',
index='vendedor',
columns='region',
aggfunc='sum',
fill_value=0,
margins=True # Agrega totales
)
print("Tabla pivot - Ventas por vendedor y region:")
print(pivot)
# Pivot con multiples valores
pivot_completo = df.pivot_table(
values=['monto', 'cantidad'],
index='vendedor',
columns='producto',
aggfunc={'monto': 'sum', 'cantidad': 'mean'},
fill_value=0
)
print("\nPivot con monto y cantidad:")
print(pivot_completo)
# Cross-tabulation (conteos)
cross = pd.crosstab(df['vendedor'], df['region'], margins=True)
print("\nConteo de transacciones:")
print(cross)
Value Counts y Distribucion
# Conteo de valores (frecuencia)
print(df['producto'].value_counts())
print("\nPorcentajes:")
print(df['producto'].value_counts(normalize=True).mul(100).round(1))
# Distribucion de montos
print("\nDistribucion de montos:")
print(df['monto'].describe())
print(f"\nMediana: {df['monto'].median():.2f}")
print(f"Skewness: {df['monto'].skew():.2f}")
print(f"Kurtosis: {df['monto'].kurtosis():.2f}")
Video Recomendado
Pandas GroupBy - Tutorial Completo
Ejercicio Practico
Crea un notebook 08_filtrado_groupby.ipynb:
- Genera un dataset de 500 ventas con columnas: vendedor, region, producto, monto, fecha
- Filtra ventas mayores a $2000 en la region Norte
- Calcula el total de ventas por vendedor y ordena de mayor a menor
- Crea una tabla pivot con vendedores en filas y regiones en columnas
- Calcula el ranking de cada vendedor dentro de su region
- Encuentra el producto mas vendido por region
💡 Concepto Clave
Revisemos los puntos más importantes de esta lección antes de continuar.
Resumen
- Filtrado: Condiciones booleanas, isin(), query()
- GroupBy: Agrupar + agregar (sum, mean, count, etc.)
- agg(): Multiples funciones de agregacion en una llamada
- transform(): Aplicar funcion manteniendo el indice original
- pivot_table(): Tablas dinamicas como en Excel
- value_counts(): Distribucion de valores categoricos
🧠 Pon a prueba tu conocimiento
¿Cuál es el aspecto más importante que aprendiste en esta lección?
- Comprendo el concepto principal y puedo explicarlo con mis palabras
- Entiendo cómo aplicarlo en mi situación específica
- Necesito repasar algunas partes antes de continuar
- Quiero ver más ejemplos prácticos del tema
✅ ¡Excelente! Continúa con la siguiente lección para profundizar más.