通过使用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)
似乎在这里需要,但我很难理解如何继续。
答案 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