Вы можете использовать следующие методы для совместного использования функций groupby() и transform() в кадре данных pandas:
Способ 1: используйте groupby() и transform() со встроенной функцией
df['new'] = df.groupby('group_var')['value_var']. transform('mean')
Способ 2: используйте groupby() и transform() с пользовательской функцией
df['new'] = df.groupby('group_var')['value_var']. transform ( lambda x: some function)
В следующих примерах показано, как использовать каждый метод на практике со следующими пандами DataFrame:
import pandas as pd
#create DataFrame
df = pd.DataFrame({'team': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
'points': [30, 22, 19, 14, 14, 11, 20, 28]})
#view DataFrame
print(df)
team points
0 A 30
1 A 22
2 A 19
3 A 14
4 B 14
5 B 11
6 B 20
7 B 28
Пример 1: Использование groupby() и transform() со встроенной функцией
В следующем коде показано, как использовать функции groupby( ) и trasnform() для добавления в DataFrame нового столбца с именем mean_points:
#create new column called mean_points
df['mean_points'] = df.groupby('team')['points']. transform('mean')
#view updated DataFrame
print(df)
team points mean_points
0 A 30 21.25
1 A 22 21.25
2 A 19 21.25
3 A 14 21.25
4 B 14 18.25
5 B 11 18.25
6 B 20 18.25
7 B 28 18.25
Среднее значение очков для игроков команды А составило 21,25 , а среднее значение очков для игроков команды Б — 18,25 , поэтому эти значения были присвоены каждому игроку в новом столбце соответственно.
Обратите внимание, что мы могли бы также использовать другую встроенную функцию, такую как sum() , чтобы создать новый столбец, показывающий сумму очков, набранных каждой командой:
#create new column called sum_points
df['sum_points'] = df.groupby('team')['points']. transform('sum')
#view updated DataFrame
print(df)
team points sum_points
0 A 30 85
1 A 22 85
2 A 19 85
3 A 14 85
4 B 14 73
5 B 11 73
6 B 20 73
7 B 28 73
Сумма очков игроков команды А составила 85 , а сумма очков игроков команды Б — 73 , поэтому эти значения были присвоены каждому игроку в новом столбце соответственно.
Пример 2: Использование groupby() и transform() с пользовательской функцией
В следующем коде показано, как использовать функции groupby( ) и transform() для создания пользовательской функции, вычисляющей процент от общего количества очков, набранных каждым игроком в соответствующих командах:
#create new column called percent_of_points
df['percent_of_points'] = df.groupby('team')['points']. transform ( lambda x: x/x. sum ())
#view updated DataFrame
print(df)
team points percent_of_points
0 A 30 0.352941
1 A 22 0.258824
2 A 19 0.223529
3 A 14 0.164706
4 B 14 0.191781
5 B 11 0.150685
6 B 20 0.273973
7 B 28 0.383562
Вот как интерпретировать вывод:
- Первый игрок команды А набрал 30 из 85 общих очков среди игроков команды А. Таким образом, его процент от общего количества набранных баллов составил 30/85 = 0,352941 .
- Второй игрок команды А набрал 22 из 85 общих очков среди игроков команды А. Таким образом, его процент от общего количества набранных баллов составил 22/85 = 0,258824 .
И так далее.
Обратите внимание, что мы можем использовать лямбда -аргумент в функции transform() для выполнения любых пользовательских вычислений, которые нам нужны.
Дополнительные ресурсы
В следующих руководствах объясняется, как выполнять другие распространенные операции в pandas:
Как выполнить GroupBy Sum в Pandas
Как использовать Groupby и Plot в Pandas
Как подсчитать уникальные значения с помощью GroupBy в Pandas