2016-09-27 187 views
1

通过使用Pandas groupby,我得到了某些用户平均每周某一天有多少活动的数据。按用户和天分组,我计算了过去30天内几个用户的最大值和平均值。使用Pandas groupby方法,在每个组中找到最大值

现在我想要为每个用户找到一周中的哪一天对应其日常最大活动,以及该活动的平均幅度。

大熊猫执行这样的任务的方法是什么?

原始数据看起来是这样的:

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

具有这些团体的对象从创建如下:

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

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

的GROUPBY物体看起来是这样的:

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

熊猫groupby方法filter似乎需要在这里,但我很难过如何继续。

+2

您能否提供可重现的样本输入数据集和所需的数据集? – MaxU

回答

3

我首先在'userID'上做一个groupby,然后编写一个apply函数来完成剩下的工作。 apply函数将采用'userID'组,然后在'weekday'上执行另一个groupby来完成您的聚合,然后仅返回包含maxDaily的最大值的行,可以通过argmax找到该行。

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) 

我添加一行到您的样本数据,以确保每天聚集了正常工作,因为你的样本数据只包含每个工作日一个条目:

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 

输出结果:

 weekday countActivity   
        meanDaily maxDaily 
userID        
3   1   78209 78210