当DF中的类别发生变化时,重置滚动计算

2024-04-26 09:49:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个df,看起来像这样:

    Category    Product     Location    Date formatted  Volume
0   A           TYPE_B      Central     2019-04-01      13.0
1   A           TYPE_B      Central     2019-05-01      13.0
2   A           TYPE_B      Central     2019-06-01      12.0
3   A           TYPE_B      Central     2019-07-01      14.0
4   A           TYPE_B      Central     2019-08-01      14.0
5   A           TYPE_B      Central     2019-09-01      13.0
6   A           TYPE_B      Central     2019-10-01      14.0
7   A           TYPE_B      Central     2019-11-01      13.0
8   A           TYPE_B      Central     2019-12-01      13.0
9   A           TYPE_B      Central     2020-01-01      13.0
10  A           TYPE_B      Central     2020-02-01      13.0
11  A           TYPE_B      Central     2020-03-01      15.0
12  A           TYPE_B      East        2019-04-01      21.0
13  A           TYPE_B      East        2019-05-01      20.0
14  A           TYPE_B      East        2019-06-01      18.0
15  A           TYPE_B      East        2019-07-01      21.0
16  A           TYPE_B      East        2019-08-01      22.0
17  A           TYPE_B      East        2019-09-01      19.0
18  A           TYPE_B      East        2019-10-01      20.0
19  A           TYPE_B      East        2019-11-01      20.0
20  A           TYPE_B      East        2019-12-01      19.0
21  A           TYPE_B      East        2020-01-01      20.0
22  A           TYPE_B      East        2020-02-01      20.0
23  A           TYPE_B      East        2020-03-01      27.0

我试图计算从数据的开始(“2019-04-01”)和结束(“2020-03-01”)时间范围内每个地点的3个月滚动交易量,到目前为止,我使用以下代码:

df['Rolling_3_] = df.loc.iloc[:,4].rolling(window=4).mean()

这给了我整个数据帧的滚动3个月的平均值。但是,有人知道我如何重新开始滚动月计算,以便当它到达另一个“位置”时,如“东”吗“它将计算该位置的滚动3个月平均值,然后转到下一个位置,重新开始计算?本质上,计算整个数据集的滚动3个月,但其值适用于该位置。有没有一种方法可以让我对约会本身这样做?例如,当“2019-04-01”再次出现时,计算将重新开始

非常感谢您提前提供的任何帮助/建议

亲切问候,


0条回答
网友
1楼 · 发布于 2024-04-26 09:49:26

您可以进行分组:

df.groupby(['Category','Product','Location']).Volume.rolling(3).mean()

给你:

Category  Product  Location    
A         TYPE_B   Central   0           NaN
                             1           NaN
                             2     12.666667
                             3     13.000000
                             4     13.333333
                             5     13.666667
                             6     13.666667
                             7     13.333333
                             8     13.333333
                             9     13.000000
                             10    13.000000
                             11    13.666667
                   East      12          NaN
                             13          NaN
                             14    19.666667
                             15    19.666667
                             16    20.333333
                             17    20.666667
                             18    20.333333
                             19    19.666667
                             20    19.666667
                             21    19.666667
                             22    19.666667
                             23    22.333333
Name: Volume, dtype: float64

要将其放入数据帧中,由于索引不同,需要传递底层numpy数组

# notice `values` at the end
df['rolling_mean'] = df.groupby(['Category','Product','Location']).Volume.rolling(3).mean().values

相关问题 更多 >