我有一个数据框,我想计算扩展平均值超过一列(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
@H_502_7@我需要计算每周用户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
@H_502_7@请注意,每个用户/周的expanding_mean_quiz_score是该用户在前几周的分数的平均值.
谢谢你的帮助,我从来没有使用过expanding_mean()而且我在这里难过.
解决方法:
您可以将用户ID和“周”分组,并跟踪这些分组的总分数和计数.然后在groupby对象上使用扩展方法来累积分数和计数.最后,通过划分两个累积来获得所需的列.
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
@H_502_7@版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。