我有一个数据框,我想在一列(quiz_score)上计算扩展均值,但需要按两个不同的列(userid和week)进行分组。数据如下所示:
data = {"userid": ['1','1','1','1','1','1','1','1', '2','2','2','2','2','2','2','2'],\
"week": [1,1,2,2,3,3,4,4, 1,2,2,3,3,4,4,5],\
"quiz_score": [12, 14, 14, 15, 9, 15, 11, 14, 15, 14, 15, 13, 15, 10, 14, 14]}
>>> df = pd.DataFrame(data, columns = ['userid', 'week', 'quiz_score'])
>>> df
userid week quiz_score
0 1 1 12
1 1 1 14
2 1 2 14
3 1 2 15
4 1 3 9
5 1 3 15
6 1 4 11
7 1 4 14
8 2 1 15
9 2 2 14
10 2 2 15
11 2 3 13
12 2 3 15
13 2 4 10
14 2 4 14
15 2 5 14
我需要计算每周用户ID的扩展方式 - 也就是说,对于每周每个用户,我需要他们在前几周的平均测验得分。我知道解决方案将涉及以某种形式使用shift()和pd.expanding_mean()或.expanding()。mean(),但我无法使分组和移位正确 - 甚至当我尝试不移动时,结果没有正确分组,似乎只是在行中扩展平均值,好像根本没有分组一样:
df.groupby([' userid','周'])。apply(pd.expanding_mean).reset_index()
要清楚,正确的结果将如下所示:
userid week expanding_mean_quiz_score
0 1 1 NA
1 1 2 13
2 1 3 13.75
3 1 4 13.166666
4 1 5 13
5 1 6 13
6 2 1 NA
7 2 2 15
8 2 3 14.666666
9 2 4 14.4
10 2 5 13.714
11 2 6 13.75
请注意,每个用户/周的expanding_mean_quiz_score是该用户在前几周内得分的平均值。
感谢您的帮助,我从未使用过expand_mean()而且我在这里难倒。
答案 0 :(得分:1)
您可以按userid
和'周'分组并跟踪这些分组的总分和计数。然后在groupby对象上使用expanding
方法来累积分数和计数。最后,通过划分两个累积来获得所需的列。
a=df.groupby(['userid', 'week'])['quiz_score'].agg(('sum', 'count'))
a = a.reindex(pd.MultiIndex.from_product([['1', '2'], range(1,7)], names=['userid', 'week']))
b = a.groupby(level=0).cumsum().groupby(level=0).shift(1)
b['em_quiz_score'] = b['sum'] / b['count']
c = b.reset_index().drop(['count', 'sum'], axis=1)
d = c.groupby('userid').fillna(method='ffill')
d['userid'] = c['userid']
d = d[['userid', 'week', 'em_quiz_score']]
userid week em_quiz_score
0 1 1 NaN
1 1 2 13.000000
2 1 3 13.750000
3 1 4 13.166667
4 1 5 13.000000
5 1 6 13.000000
6 2 1 NaN
7 2 2 15.000000
8 2 3 14.666667
9 2 4 14.400000
10 2 5 13.714286
11 2 6 13.750000