Pandas — это мощная библиотека Python для обработки и анализа данных. Одна из наиболее часто используемых её функций — возможность группировки данных и выполнения агрегатных вычислений. В этой статье рассматриваются различные методы эффективного вычисления агрегатных сумм после группировки данных с помощью метода groupby()
, предлагаются решения для различных уровней сложности и желаемых форматов вывода.
Оглавление:
- Простое суммирование с groupby()
- Множественные агрегации с agg()
- Пользовательская агрегация с apply()
- Накопленные суммы с groupby() и cumsum()
- Преобразование данных с pivot_table()
Простое суммирование с groupby()
Простейший способ вычислить сумму столбца после группировки — использовать groupby()
непосредственно с методом sum()
:
import pandas as pd
data = {'Group': ['A', 'A', 'B', 'B', 'B', 'A'],
'Value': [10, 20, 15, 5, 25, 30]}
df = pd.DataFrame(data)
# Группировка по 'Group' и суммирование 'Value'
grouped_sum = df.groupby('Group')['Value'].sum()
print(grouped_sum)
Это кратко создает Series с суммой ‘Value’ для каждой группы.
Множественные агрегации с agg()
Метод agg()
позволяет эффективно вычислять несколько агрегатных статистик одновременно. Это особенно полезно, когда вам нужно больше, чем просто сумма:
import pandas as pd
data = {'Group': ['A', 'A', 'B', 'B', 'B', 'A'],
'Value': [10, 20, 15, 5, 25, 30]}
df = pd.DataFrame(data)
# Вычисление суммы, среднего и количества для каждой группы
aggregated = df.groupby('Group')['Value'].agg(['sum', 'mean', 'count'])
print(aggregated)
Эта единственная строка кода вычисляет сумму, среднее и количество ‘Value’ для каждой группы, в результате чего получается DataFrame.
Пользовательская агрегация с apply()
Для более сложных сценариев, требующих пользовательской логики агрегации, метод apply()
обеспечивает максимальную гибкость. Вы можете определить функцию для выполнения любых необходимых вычислений:
import pandas as pd
import numpy as np
data = {'Group': ['A', 'A', 'B', 'B', 'B', 'A'],
'Value': [10, 20, 15, 5, 25, 30]}
df = pd.DataFrame(data)
def custom_agg(x):
return pd.Series({'sum': x.sum(), 'range': x.max() - x.min()})
# Применение пользовательской функции агрегации
result = df.groupby('Group')['Value'].apply(custom_agg).reset_index()
print(result)
Здесь пользовательская функция вычисляет сумму и диапазон для каждой группы.
Накопленные суммы с groupby()
и cumsum()
Чтобы получить накопленные суммы в каждой группе, объедините groupby()
с методом cumsum()
:
import pandas as pd
data = {'Group': ['A', 'A', 'B', 'B', 'B', 'A'],
'Value': [10, 20, 15, 5, 25, 30]}
df = pd.DataFrame(data)
# Вычисление накопленной суммы для каждой группы
df['Cumulative Sum'] = df.groupby('Group')['Value'].cumsum()
print(df)
Это добавляет новый столбец, показывающий текущий итог в каждой группе.
Преобразование данных с pivot_table()
Для более наглядного и удобного для анализа представления агрегированных данных, особенно при работе с несколькими группирующими переменными, используйте pivot_table()
:
import pandas as pd
data = {'Group': ['A', 'A', 'B', 'B', 'B', 'A'],
'Category': ['X', 'Y', 'X', 'Y', 'Z', 'X'],
'Value': [10, 20, 15, 5, 25, 30]}
df = pd.DataFrame(data)
pivot_table = pd.pivot_table(df, values='Value', index='Group', columns='Category', aggfunc='sum', fill_value=0)
print(pivot_table)
Это создает сводную таблицу, суммирующую данные, что упрощает сравнение сумм по различным категориям внутри каждой группы.