Pandas es una potente librería de Python para la manipulación y el análisis de datos. Una de sus funciones más utilizadas es la capacidad de agrupar datos y realizar cálculos agregados. Este artículo explora varios métodos para calcular eficientemente sumas agregadas después de agrupar datos usando el método groupby()
, ofreciendo soluciones para diferentes niveles de complejidad y formatos de salida deseados.
Tabla de contenido:
- Suma básica con groupby()
- Agrupaciones múltiples con agg()
- Agrupación personalizada con apply()
- Sumas acumuladas con groupby() y cumsum()
- Reestructuración de datos con pivot_table()
Suma básica con groupby()
La forma más sencilla de calcular la suma de una columna después de agrupar es usar groupby()
directamente con el método sum()
:
import pandas as pd
data = {'Grupo': ['A', 'A', 'B', 'B', 'B', 'A'],
'Valor': [10, 20, 15, 5, 25, 30]}
df = pd.DataFrame(data)
# Agrupar por 'Grupo' y sumar 'Valor'
suma_agrupada = df.groupby('Grupo')['Valor'].sum()
print(suma_agrupada)
Esto produce concisamente una Serie con la suma de ‘Valor’ para cada grupo.
Agrupaciones múltiples con agg()
El método agg()
permite el cálculo eficiente de múltiples estadísticas agregadas simultáneamente. Esto es particularmente útil cuando se necesita algo más que la suma:
import pandas as pd
data = {'Grupo': ['A', 'A', 'B', 'B', 'B', 'A'],
'Valor': [10, 20, 15, 5, 25, 30]}
df = pd.DataFrame(data)
# Calcular la suma, la media y el conteo para cada grupo
agregado = df.groupby('Grupo')['Valor'].agg(['sum', 'mean', 'count'])
print(agregado)
Esta única línea de código calcula la suma, la media y el conteo de ‘Valor’ para cada grupo, resultando en un DataFrame.
Agrupación personalizada con apply()
Para escenarios más complejos que requieren una lógica de agregación personalizada, el método apply()
proporciona la máxima flexibilidad. Puede definir una función para realizar cualquier cálculo deseado:
import pandas as pd
import numpy as np
data = {'Grupo': ['A', 'A', 'B', 'B', 'B', 'A'],
'Valor': [10, 20, 15, 5, 25, 30]}
df = pd.DataFrame(data)
def agregacion_personalizada(x):
return pd.Series({'sum': x.sum(), 'range': x.max() - x.min()})
# Aplicar la función de agregación personalizada
resultado = df.groupby('Grupo')['Valor'].apply(agregacion_personalizada).reset_index()
print(resultado)
Aquí, una función personalizada calcula tanto la suma como el rango para cada grupo.
Sumas acumuladas con groupby()
y cumsum()
Para obtener sumas acumuladas dentro de cada grupo, combine groupby()
con el método cumsum()
:
import pandas as pd
data = {'Grupo': ['A', 'A', 'B', 'B', 'B', 'A'],
'Valor': [10, 20, 15, 5, 25, 30]}
df = pd.DataFrame(data)
# Calcular la suma acumulada para cada grupo
df['Suma Acumulada'] = df.groupby('Grupo')['Valor'].cumsum()
print(df)
Esto agrega una nueva columna que muestra el total acumulado dentro de cada grupo.
Reestructuración de datos con pivot_table()
Para una representación más visual y fácilmente analizable de los datos agregados, especialmente cuando se trata de múltiples variables de agrupación, utilice pivot_table()
:
import pandas as pd
data = {'Grupo': ['A', 'A', 'B', 'B', 'B', 'A'],
'Categoría': ['X', 'Y', 'X', 'Y', 'Z', 'X'],
'Valor': [10, 20, 15, 5, 25, 30]}
df = pd.DataFrame(data)
tabla_dinamica = pd.pivot_table(df, values='Valor', index='Grupo', columns='Categoría', aggfunc='sum', fill_value=0)
print(tabla_dinamica)
Esto crea una tabla dinámica que resume los datos, facilitando la comparación de sumas entre diferentes categorías dentro de cada grupo.