Pandas: как группировать и агрегировать по нескольким столбцам


Часто вам может понадобиться группировать и агрегировать по нескольким столбцам кадра данных pandas.

К счастью, это легко сделать с помощью функций pandas .groupby() и .agg() .

В этом руководстве объясняется несколько примеров использования этих функций на практике.

Пример 1: группировка по двум столбцам и поиск среднего

Предположим, у нас есть следующие Pandas DataFrame:

import pandas as pd

#create DataFrame
df = pd.DataFrame({'team': ['A', 'B', 'B', 'B', 'B', 'M', 'M', 'M'],
 'position': ['G', 'G', 'F', 'G', 'F', 'F', 'C', 'C'],
 'assists': [5, 7, 7, 8, 5, 7, 6, 9],
 'rebounds': [11, 8, 10, 6, 6, 9, 6, 10]})

#view DataFrame
print(df)

 team position assists rebounds
0 A G 5 11
1 B G 7 8
2 B F 7 10
3 B G 8 6
4 B F 5 6
5 M F 7 9
6 M C 6 6
7 M C 9 10

Следующий код показывает, как сгруппировать по столбцам «команда» и «позиция» и найти средние передачи:

df.groupby(['team', 'position']).agg({'assists': ['mean']}). reset_index()


 team position assists
 mean
0 A G 5.0
1 B F 6.0
2 B G 7.5
3 M C 7.5
4 M F 7.0

Вывод говорит нам:

  • Среднее количество передач для игроков на позиции G в команде А равно 5,0 .
  • Среднее количество передач для игроков на позиции F в команде B равно 6,0 .
  • Среднее количество передач для игроков на позиции G в команде B равно 7,5 .

И так далее.

Мы также можем использовать следующий код для переименования столбцов в результирующем DataFrame:

#group by team and position and find mean assists
new = df.groupby(['team', 'position']).agg({'assists': ['mean']}). reset_index()

#rename columns 
new.columns = ['team', 'pos', 'mean_assists']

#view DataFrame
print(new)

 team pos mean_assists
0 A G 5.0
1 B F 6.0
2 B G 7.5
3 M C 7.5
4 M F 7.0

Пример 2: группировка по двум столбцам и поиск нескольких статистических данных

Предположим, мы используем тот же DataFrame pandas, что и в предыдущем примере:

import pandas as pd

#create DataFrame
df = pd.DataFrame({'team': ['A', 'B', 'B', 'B', 'B', 'M', 'M', 'M'],
 'position': ['G', 'G', 'F', 'G', 'F', 'F', 'C', 'C'],
 'assists': [5, 7, 7, 8, 5, 7, 6, 9],
 'rebounds': [11, 8, 10, 6, 6, 9, 6, 10]})

Следующий код показывает, как найти медиану и максимальное количество подборов, сгруппированных по столбцам «команда» и «позиция»:

df.groupby(['team', 'position']).agg({'rebounds': ['median', 'max']}). reset_index()


 team position rebounds
 median max
0 A G 11 11
1 B F 8 10
2 B G 7 8
3 M C 8 10
4 M F 9 9

Вывод говорит нам:

  • Среднее количество передач по подборам для игроков на позиции G в команде А равно 11 .
  • Максимальное количество подборов для игроков на позиции G в команде A равно 11 .
  • Среднее количество подборов для игроков на позиции F в команде B равно 8 .
  • Максимальное количество подборов для игроков на позиции F в команде B равно 10 .

И так далее.

Дополнительные ресурсы

Как фильтровать кадр данных Pandas по нескольким условиям
Как подсчитать пропущенные значения в Pandas DataFrame
Как сложить несколько фреймов данных Pandas