2016-09-27 2 views
1

Pandas groupbyを使用することにより、ある特定の曜日に平均して特定のユーザがどのくらい活動しているかに関するデータが得られます。ユーザーと曜日によってグループ化され、過去30日間に複数のユーザーの最大値と平均値を計算します。パンダのgroupbyメソッドを使用して、各グループの中で最大の値を見つけよう

ここで、毎日の最大アクティビティに対応する曜日と、そのアクティビティの平均的な規模は何ですか。

このようなタスクを実行するためのパンダの方法は何ですか?

元のデータは次のようになります。

userID countActivity weekday 
0 3  25    5 
1 3  58    6 
2 3  778    0 
3 3  78208   1 
4 3  6672   2 
これらのグループを持つオブジェクトから作成され

    countActivity  
       maxDaily meanDaily 
userID weekday  
3  0  84066  18275.6 
     1  78208  20698.5 
     2  172579  64930.75 
     3  89535  25443 
     4  6152  2809 

aggregations = { 
    'countActivity': { 
     'maxDaily': 'max', 
     'meanDaily': 'mean' 
    } 
} 

dailyAggs = df.groupby(['userID','weekday']).agg(aggregations) 

GROUPBYオブジェクトは、次のようになります

パンダのグループ方法filterがここに必要ですが、私はどのように進行するのか困っている。

+2

再現可能なサンプル入力データセットと目的のデータセットを提供できますか? – MaxU

答えて

3

私が最初に'userID'groupbyを行い、その後、残りを行うにapply機能を記述します。 apply関数は'userID'グループをとり、'weekday'に別のgroupbyを実行して集計を行い、maxDailyの最大値を含む行のみを返します。これはargmaxとなります。

userID countActivity weekday 
0  3    25  5 
1  3    58  6 
2  3   778  0 
3  3   78208  1 
4  3   6672  2 
5  3   78210  1 

結果の出力:

def get_max_daily(grp): 
    aggregations = {'countActivity': {'maxDaily': 'max', 'meanDaily': 'mean'}} 
    grp = grp.groupby('weekday').agg(aggregations).reset_index() 
    return grp.loc[grp[('countActivity', 'maxDaily')].argmax()] 

result = df.groupby('userID').apply(get_max_daily) 

は、私はあなたのサンプルデータが平日のみごとに1つのエントリが含まれているので、毎日の集計は、正常に働いていたことを確認するために、サンプルデータに行を追加しました

 weekday countActivity   
        meanDaily maxDaily 
userID        
3   1   78209 78210 
関連する問題