首页 > 解决方案 > DF中类别更改时重置滚动计算

问题描述

我有一个看起来像这样的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”再次出现时,计算重新开始。

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

亲切的问候,

标签: pythonpandas

解决方案


你可以做一个groupby:

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

推荐阅读