提问者:小点点

Pandas groupby累计/滚动总和、平均值和标准差


我有一个数据框(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

我想groupby月-年name来获得列a、列b的平均值和列c的std的总和。但是,我希望总和、平均值和std是一个滚动/累积数。

例如,对于这个数据集,要找到我想要的a的输出,我可以做以下事情

df. group by(['month_year','name']).a gg(sum).group by(level=[1]).a gg({'a':np.cum sum})

得到这样的东西

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

我可以做些什么来找到bc的std的累积平均值以获得如下所示的输出?

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

谢谢你。


共1个答案

匿名用户

您可以使用扩展来做到这一点

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

然后您要groupby并选择每个['月-年','名称']组中的最后一行。

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