web-dev-qa-db-ja.com

pandas groupbyの平均を取得

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
8
jxn

インデックスのリセットは機能するはずです。これを試して:

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を使用します。これにより、平均が得られるはずです。

これが役立つかどうかをお知らせください。

10
Jerome Montino