User_idあたりの平均月間コストを見つけようとしていますが、ユーザーあたりの平均コストまたはユーザーあたりの月間コストしか取得できません。
私はユーザーと月でグループ化するので、groupbyの出力を別のものに変換しない限り、2番目のgroupby(月)の平均を取得する方法はありません。
これは私のdfです:
df = { 'id' : pd.Series([1,1,1,1,2,2,2,2]),
'cost' : pd.Series([10,20,30,40,50,60,70,80]),
'mth': pd.Series([3,3,4,5,3,4,4,5])}
cost id mth
0 10 1 3
1 20 1 3
2 30 1 4
3 40 1 5
4 50 2 3
5 60 2 4
6 70 2 4
7 80 2 5
毎月の合計を取得できますが、各user_idの月の平均が必要です。
df.groupby(['id','mth'])['cost'].sum()
id mth
1 3 30
4 30
5 40
2 3 50
4 130
5 80
私はこのようなものが欲しい:
id average_monthly
1 (30+30+40)/3
2 (50+130+80)/3
インデックスのリセットは機能するはずです。これを試して:
In [19]: df.groupby(['id', 'mth']).sum().reset_index().groupby('id').mean()
Out[19]:
mth cost
id
1 4.0 33.333333
2 4.0 86.666667
必要に応じて、mth
をドロップできます。ロジックは、sum
部分の後に、次のようになります:
In [20]: df.groupby(['id', 'mth']).sum()
Out[20]:
cost
id mth
1 3 30
4 30
5 40
2 3 50
4 130
5 80
この時点でインデックスをリセットすると、一意の月が得られます。
In [21]: df.groupby(['id', 'mth']).sum().reset_index()
Out[21]:
id mth cost
0 1 3 30
1 1 4 30
2 1 5 40
3 2 3 50
4 2 4 130
5 2 5 80
もう一度グループ化するだけで、今度はmean
の代わりにsum
を使用します。これにより、平均が得られるはずです。
これが役立つかどうかをお知らせください。