按累计/累计总和、平均值和标准差分组的 pandas [英] Pandas groupby cumulative/rolling sum,average, and std

查看:21
本文介绍了按累计/累计总和、平均值和标准差分组的 pandas 的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个数据帧(df),如下所示:

month-year    name    a    b    c
2018-01       X       2    1    4
2018-01       Y       1    0    5
2018-01       X       1    6    3
2018-01       Y       4    10   7
2018-02       X       13   4    2
2018-02       Y       22   13   9
2018-02       X       3    7    4
2018-02       Y       2    15   0
我希望groupbymonth-yearname得到a列的总和、b列的平均值和c列的标准差。但是,我希望总和、平均值和标准差是一个滚动/累积数字。

例如,对于此数据集,要找到我想要的a的输出,我可以执行如下操作

df.groupby(['month_year','name']).agg(sum).groupby(level=[1]).agg({'a':np.cumsum})

以获取类似

的内容
month-year    name    a
2018-01       X       3
              Y       5
2018-02       X       19
              Y       29

如何才能找到bc的累计平均值才能得到如下所示的输出?

month-year    name    a    b    c
2018-01       X       3    3.5  0.71
              Y       5    5    1.41
2018-02       X       19   4.5  0.96
              Y       29   9.5  3.86

谢谢。

推荐答案

您可以使用expanding

执行此操作

第一步是计算每一列的扩展总和、平均值和标准差,只按'name'分组,并将其连接回原始DataFrame

然后,您希望按分组并选择每个['month-year', 'name']组中的最后一行。

df = df.join(df.groupby(['name']).expanding().agg({'a': sum, 'b': 'mean', 'c': 'std'})
               .reset_index(level=0, drop=True)
               .add_suffix('_roll'))

df.groupby(['month-year', 'name']).last().drop(columns=['a', 'b', 'c'])

输出:

                 a_roll  b_roll    c_roll
month-year name                          
2018-01    X        3.0     3.5  0.707107
           Y        5.0     5.0  1.414214
2018-02    X       19.0     4.5  0.957427
           Y       29.0     9.5  3.862210

这篇关于按累计/累计总和、平均值和标准差分组的 pandas 的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆