pandas groupby resume datos por categoría mediante el patrón dividir, aplicar y combinar. Eliges una o varias columnas como clave, aplicas suma, media, conteo u otra operación y recibes una tabla consolidada. Es apropiado para calcular ingresos por región, ticket medio por canal o pedidos por mes.

Si todavía estás preparando la base, consulta la guía de pandas para análisis de datos. Una agrupación fiable requiere tipos correctos, tratamiento consciente de ausentes y nombres de columna claros.

Primer groupby con suma y media

import pandas as pd

ventas = pd.DataFrame({
    "region": ["Sur", "Sur", "Norte", "Norte"],
    "canal": ["web", "tienda", "web", "tienda"],
    "ingresos": [1200, 800, 950, 1100],
    "pedidos": [12, 5, 10, 7],
})

resumen = (
    ventas.groupby("region", as_index=False)
    .agg(ingresos_totales=("ingresos", "sum"),
         ingreso_medio=("ingresos", "mean"),
         pedidos_totales=("pedidos", "sum"))
)

La agregación nombrada indica qué columna y función producen cada salida. as_index=False conserva region como columna. Sin esa opción, la clave se convierte en índice y puede exigir reset_index() antes de exportar o combinar.

Agrupa por varias columnas

por_canal = (
    ventas.groupby(["region", "canal"], as_index=False)
    .agg(ingresos=("ingresos", "sum"), pedidos=("pedidos", "sum"))
    .sort_values("ingresos", ascending=False)
)

Las claves nulas se excluyen de forma predeterminada. Usa dropna=False cuando el grupo “sin región” deba aparecer en una auditoría. Considera sort=False si quieres conservar el orden de entrada y evitar una ordenación innecesaria.

agg, transform y filter resuelven problemas distintos

agg reduce cada grupo. transform devuelve un valor para cada fila original y sirve para participaciones o comparaciones con la media:

ventas["media_region"] = (
    ventas.groupby("region")["ingresos"].transform("mean")
)
ventas["participacion"] = (
    ventas["ingresos"]
    / ventas.groupby("region")["ingresos"].transform("sum")
)

filter conserva o elimina grupos completos:

regiones_relevantes = ventas.groupby("region").filter(
    lambda grupo: grupo["pedidos"].sum() >= 15
)

Prefiere agregaciones vectorizadas como "sum", "mean" y "size" antes que apply con una función Python. Expresan mejor la intención y suelen ser más eficientes.

Agrupa series temporales

ventas["fecha"] = pd.to_datetime(ventas["fecha"], errors="raise")

mensual = (
    ventas.groupby(pd.Grouper(key="fecha", freq="MS"))
    .agg(ingresos=("ingresos", "sum"))
    .reset_index()
)

MS etiqueta cada periodo al inicio del mes. Comprueba zona horaria y granularidad antes de comparar informes.

Errores comunes y validación

No uses count si quieres contar filas incluyendo valores nulos, porque omite los ausentes de esa columna. Usa size para contar filas. Verifica también que los números no hayan llegado como texto. Reconcilia totales antes y después de agrupar y ordena explícitamente cuando la presentación dependa del orden.

La documentación oficial de pandas sobre GroupBy, consultada el 28 de julio de 2026, explica agregación, transformación y filtrado y recomienda operaciones específicas antes de funciones Python personalizadas.