Una de las operaciones más poderosas en análisis de datos es la agrupación: "¿cuál es el promedio de ventas por región?", "¿cuántos empleados hay por departamento?", "¿qué producto tiene más pedidos por mes?". Para eso existe groupby en pandas.
¿Qué hace groupby?
groupby divide el DataFrame en grupos según los valores de una columna, y luego aplica una función (suma, promedio, conteo) a cada grupo. Es el equivalente de GROUP BY en SQL.
Sintaxis
df.groupby('columna')['columna_a_calcular'].funcion()
Ejemplo base
import pandas as pd
df = pd.DataFrame({
'empleado': ['Ana', 'Carlos', 'María', 'Luis', 'Sofía'],
'depto': ['Tech', 'Ventas', 'Tech', 'Ventas', 'Tech'],
'salario': [3000, 2800, 4500, 3200, 3800],
'ventas': [0, 15000, 0, 22000, 0]
})
Ejemplo 1: promedio de salario por departamento
promedio = df.groupby('depto')['salario'].mean()
print(promedio)
# depto
# Tech 3766.67
# Ventas 3000.00
Ejemplo 2: múltiples funciones a la vez con agg
resumen = df.groupby('depto')['salario'].agg(['mean', 'min', 'max', 'count'])
print(resumen)
| depto | mean | min | max | count |
|---|---|---|---|---|
| Tech | 3766.67 | 3000 | 4500 | 3 |
| Ventas | 3000.00 | 2800 | 3200 | 2 |
Ejemplo 3: agrupar por múltiples columnas
df['nivel'] = ['Senior', 'Junior', 'Senior', 'Junior', 'Mid']
resultado = df.groupby(['depto', 'nivel'])['salario'].mean()
print(resultado)
Ejemplo 4: conteo de registros por grupo
conteo = df.groupby('depto').size()
print(conteo)
# Tech 3
# Ventas 2
size() cuenta las filas en cada grupo, incluyendo NaN.
count() cuenta solo los valores no nulos.
Agrupar y resetear el índice
Por defecto, groupby convierte la columna agrupada en índice. Para mantenerla como columna:
resultado = df.groupby('depto')['salario'].mean().reset_index()
print(resultado)
# depto salario
# Tech 3766.67
# Ventas 3000.00
Ejemplo real: ventas mensuales
ventas = pd.read_csv('ventas.csv', parse_dates=['fecha'])
ventas['mes'] = ventas['fecha'].dt.to_period('M')
total_mensual = ventas.groupby('mes')['monto'].sum().reset_index()
print(total_mensual)
Errores frecuentes
Olvidar que groupby devuelve un objeto GroupBy: df.groupby('col') por sí solo no devuelve datos útiles — debes aplicar una función como .mean(), .sum(), .count(), etc.
Confundir count() y size(): size() cuenta todas las filas del grupo (incluidos NaN). count() cuenta solo valores no nulos. Para saber cuántos registros hay por grupo, usa size().
No resetear el índice: si usas el resultado para visualizarlo o unirlo con otro DataFrame, el índice agrupado puede causar problemas. Usa .reset_index().
Aprende haciendo, no solo leyendo
Leer es el primer paso. El verdadero aprendizaje ocurre cuando practicas con ejercicios reales de SQL y recibes corrección inmediata de IA.
Comenzar gratis →