Volver al curso

Data Science con Python: Análisis de Datos para Tu Carrera

leccion
8 / 23
intermediate
8 horas
Pandas y Manipulacion de Datos

Filtrado, Seleccion y GroupBy

Lectura
60 min~4 min lectura

Filtrado, Seleccion y GroupBy

El Poder Real de Pandas

Filtrar 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:

  1. Genera un dataset de 500 ventas con columnas: vendedor, region, producto, monto, fecha
  2. Filtra ventas mayores a $2000 en la region Norte
  3. Calcula el total de ventas por vendedor y ordena de mayor a menor
  4. Crea una tabla pivot con vendedores en filas y regiones en columnas
  5. Calcula el ranking de cada vendedor dentro de su region
  6. 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.