Fundamentos de GroupBy
Divide los datos en grupos y calcula resúmenes usando el patrón dividir-aplicar-combinar con groupby().
- Comprender el patrón dividir-aplicar-combinar
- Agrupar datos por una o más columnas con groupby()
- Aplicar agregaciones como mean(), sum(), count() y describe()
- Usar agg() para varias agregaciones a la vez
El patrón dividir-aplicar-combinar
GroupBy es una de las características más potentes de pandas. Sigue un patrón de tres pasos:
- Dividir, divide el DataFrame en grupos según una o más columnas
- Aplicar, calcula una función en cada grupo de forma independiente
- Combinar, une los resultados de nuevo en un solo DataFrame
import pandas as pd
# titanic.csv ships with the course — load it from the browser file system.
df = pd.read_csv("titanic.csv")Agrupando por una sola columna
# Average survival rate by passenger class
print(df.groupby("Pclass")["Survived"].mean())Salida:
Pclass
1 0.629630
2 0.472826
3 0.242363
Name: Survived, dtype: float64
Los pasajeros de primera clase tuvieron una tasa de supervivencia del 63%, en comparación con el 24% de la tercera clase. Groupby reveló una diferencia de clase marcada en segundos.
Qué sucede paso a paso:
# This is conceptually what groupby does:
for pclass, group_df in df.groupby("Pclass"):
print(f"Class {pclass}: {group_df['Survived'].mean():.3f}")Agrupando por varias columnas
# Survival rate by class and sex
print(df.groupby(["Pclass", "Sex"])["Survived"].mean())Salida:
Pclass Sex
1 female 0.968085
male 0.368852
2 female 0.921053
male 0.157407
3 female 0.500000
male 0.135447
Name: Survived, dtype: float64
Usa unstack() para hacer esto más fácil de leer:
print(df.groupby(["Pclass", "Sex"])["Survived"].mean().unstack())Métodos de agregación
Groupby admite todas las agregaciones estándar:
# Mean fare by class
print(df.groupby("Pclass")["Fare"].mean())
# Total fare collected per class
print(df.groupby("Pclass")["Fare"].sum())
# Count of passengers per class
print(df.groupby("Pclass")["PassengerId"].count())Múltiples agregaciones con agg()
El método agg() aplica varias funciones a la vez:
print(df.groupby("Pclass")["Fare"].agg(["mean", "median", "min", "max", "count"]))Salida:
mean median min max count
Pclass
1 84.154687 60.287 0.0000 512.3292 216
2 20.662183 19.575 0.0000 73.5000 184
3 13.675550 8.050 0.0000 56.4958 491
Diferentes agregaciones por columna:
print(df.groupby("Pclass").agg({
"Survived": "mean",
"Fare": ["mean", "max"],
"Age": "median",
"Name": "count"
}))Agregando todas las columnas numéricas
# Quick summary of all numeric columns per group
print(df.groupby("Pclass").mean(numeric_only=True))GroupBy con filtros
Después de agrupar, puedes filtrar grupos completos:
# Keep only groups with more than 50 passengers
large_groups = df.groupby("Pclass").filter(lambda x: len(x) > 50)
print(large_groups["Pclass"].value_counts())Inténtalo
Usando el conjunto de datos del Titanic, calcula:
- La tarifa promedio para cada puerto de embarque
- La tasa de supervivencia para cada combinación de sexo y puerto de embarque
- Las estadísticas de edad (media, mediana, mín, máx) para cada clase de pasajero
import pandas as pd
# titanic.csv ships with the course — load it from the browser file system.
df = pd.read_csv("titanic.csv")
print("Average fare by port:")
print(df.groupby("Embarked")["Fare"].mean())
print("\nSurvival by sex and port:")
print(df.groupby(["Sex", "Embarked"])["Survived"].mean().unstack())
print("\nAge stats by class:")
print(df.groupby("Pclass")["Age"].agg(["mean", "median", "min", "max"]))Conclusiones clave
- GroupBy sigue el patrón dividir-aplicar-combinar: divide los datos, aplica una función, combina los resultados
- Agrupa por una columna para resúmenes simples y por varias columnas para análisis más profundos
agg()te permite calcular varias estadísticas a la vez, por columna si es necesario- Groupby revela patrones invisibles en los datos crudos
Desafío de práctica
Del conjunto de datos del Titanic, calcula la tasa de supervivencia para cada combinación de Pclass, Sex y si el pasajero viajaba solo (SibSp + Parch == 0). ¿Qué grupo tuvo la mayor tasa de supervivencia? ¿Cuál tuvo la menor?
1. ¿Qué hace df.groupby('col')?
2. ¿Cómo calculas la media de cada grupo?
3. ¿Qué devuelve df.groupby('col').size()?