繁体   English   中英

扩展由pandas中的多个列分组的平均值

[英]Expanding mean grouped by multiple columns in pandas

我有一个数据框,我想计算扩展平均值超过一列(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','week'])。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是该用户在前几周的分数的平均值。

谢谢你的帮助,我从来没有使用过expanding_mean()而且我在这里难过。

您可以将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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM