使用Pandas groupby方法,在每个组中查找最大值

时间:2016-09-27 18:43:06

标签: pandas

通过使用Pandas groupby,我可以获得某些用户在一周中的任何一天平均活动量的数据。按用户和日分组,我计算过去30天内几个用户的最大值和平均值。

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

pandas执行此类任务的方法是什么?

原始数据如下所示:

*(x + 3)

具有这些组的对象是根据以下内容创建的:

*(3 + x)

groupby对象看起来像这样:

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

Pandas groupby方法aggregations = { 'countActivity': { 'maxDaily': 'max', 'meanDaily': 'mean' } } dailyAggs = df.groupby(['userID','weekday']).agg(aggregations) 似乎在这里需要,但我很难理解如何继续。

1 个答案:

答案 0 :(得分:4)

我首先在groupby上执行'userID',然后编写apply函数来完成剩下的工作。 apply函数将使用'userID'组,在groupby上执行另一个'weekday'来执行聚合,然后仅返回包含{{1}的最大值的行}},可以在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