Agrupaciones y Agregaciones
Introducción
Una de las operaciones más comunes en análisis de datos es agrupar por una o más variables y luego aplicar funciones de agregación, como sumas, promedios o conteos. En Polars, esto se realiza utilizando los métodos groupby()
y agg()
sobre DataFrame
o LazyFrame
.
En este capítulo profundizaremos en cómo usar estas funciones de forma eficiente y expresiva, incluyendo múltiples agregaciones, alias, condiciones y expresiones personalizadas.
Estructura básica
df.groupby("columna").agg([
pl.col("otra_columna").sum()
])
Esto agrupa por "columna"
y suma los valores de "otra_columna"
.
Ejemplo práctico
import polars as pl
df = pl.DataFrame({
"cliente": ["Ana", "Luis", "Ana", "Luis", "Pedro"],
"monto": [100, 250, 300, 400, 150],
"producto": ["A", "B", "A", "C", "B"]
})
df.groupby("cliente").agg([
pl.col("monto").sum().alias("total"),
pl.count().alias("compras")
])
Agrupaciones múltiples
Puedes agrupar por más de una columna:
df.groupby(["cliente", "producto"]).agg([
pl.col("monto").mean().alias("promedio_monto")
])
Varias agregaciones sobre la misma columna
df.groupby("cliente").agg([
pl.col("monto").sum(),
pl.col("monto").mean(),
pl.col("monto").max()
])
Agregaciones condicionales
Puedes usar expresiones condicionales dentro de una agregación:
df.groupby("cliente").agg([
(pl.when(pl.col("monto") > 200)
.then(1)
.otherwise(0)
).sum().alias("compras_altas")
])
Esto cuenta cuántas compras superaron los 200 por cliente.
Agrupación sobre múltiples columnas dinámicamente
Con pl.all()
puedes aplicar una operación a todas las columnas (excepto las agrupadas):
df.groupby("producto").agg([
pl.all().sum()
])
También puedes excluir columnas:
df.groupby("producto").agg([
pl.exclude("cliente").mean()
])
Agregaciones con funciones personalizadas
Puedes aplicar funciones definidas por ti:
def rango(col):
return col.max() - col.min()
df.groupby("cliente").agg([
rango(pl.col("monto")).alias("rango_montos")
])
Uso en LazyFrame
La sintaxis es la misma, pero recuerda finalizar con .collect()
:
df.lazy().groupby("cliente").agg([
pl.col("monto").sum()
]).collect()
Buenas prácticas
- Usa
.alias()
para nombrar las columnas agregadas de forma clara. - Evita calcular varias veces la misma expresión (reutiliza con
alias()
). - Prefiere agrupar por múltiples columnas si existen relaciones jerárquicas (cliente + producto).
- En modo
lazy
, agrupar primero puede mejorar la eficiencia si reduces el volumen de datos temprano.
Referencias útiles
Conclusión
Las operaciones de agrupación y agregación en Polars son extremadamente expresivas y eficientes, tanto en modo eager como lazy. Su integración con expresiones permite construir análisis complejos con un código claro y conciso.
Dominar groupby()
+ agg()
es fundamental para todo trabajo de análisis exploratorio, reporting y preparación de datos para machine learning.