Pandas で groupby() 関数とtransform() 関数を使用する方法
次のメソッドを使用して、pandas DataFrame でgroupby()関数とtransform()関数を一緒に使用できます。
方法 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)
次の例は、次の pandas DataFrame で各メソッドを実際に使用する方法を示しています。
import pandas as pd #createDataFrame 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 to 30 1 to 22 2 to 19 3 to 14 4 B 14 5 B 11 6 B 20 7 B 28
例 1: 組み込み関数で groupby() と transform() を使用する
次のコードは、 groupby( ) 関数とtransform()関数を使用して、mean_points という名前の新しい列を DataFrame に追加する方法を示しています。
#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 to 30 21.25
1 to 22 21.25
2 A 19 21.25
3 to 14 21.25
4 B 14 18.25
5 B 11 18.25
6 B 20 18.25
7 B 28 18.25
チーム A のプレーヤーの平均ポイント値は21.25 、チーム B のプレーヤーの平均ポイント値は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 to 30 85
1 to 22 85
2 A 19 85
3 to 14 85
4 B 14 73
5 B 11 73
6 B 20 73
7 B 28 73
チーム A のプレーヤーのポイントの合計は85で、チーム B のプレーヤーのポイントの合計は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
結果を解釈する方法は次のとおりです。
- チーム A の最初のプレーヤーは、チーム A のプレーヤーの合計 85 点のうち 30 点を獲得しました。したがって、獲得した総得点に占める彼の割合は 30/85 = 0.352941となりました。
- チーム A の 2 番目のプレーヤーは、チーム A のプレーヤーの合計 85 点のうち 22 点を獲得しました。したがって、得点した総得点に占める彼の割合は 22/85 = 0.258824となりました。
等々。
必要なカスタム計算を実行するには、 transform()関数でラムダ引数を使用できることに注意してください。
追加リソース
次のチュートリアルでは、パンダで他の一般的な操作を実行する方法を説明します。
Pandas で GroupBy 合計を実行する方法
Pandas で Groupby と Plot を使用する方法
Pandas で GroupBy を使用して一意の値をカウントする方法