Pandas 带 groupby 的数据框滚动总和列

Pandas dataframe rolling sum column with groupby

我正在尝试创建一个新列,以提供 Values 列中值的滚动总和。滚动总和包括 4 行,即当前行和接下来的三行。我想为 'Type' 列中的每种类型执行此操作。

但是,如果在下一个类型开始之前少于 4 行,我希望滚动总和仅使用剩余的行。例如,如果当前类型的当前行之后有 2 行,则总共使用 3 行进行滚动求和。请参阅下面的 table,其中显示了我目前获得的和我期望的。

索引 类型 当前滚动总和 预期滚动总和
1 5 22 22
2 9 34 34
3 0 NaN 25
4 8 NaN 25
5 17 NaN 17
6 笔直 7 61 61
7 笔直 4 77 77
8 笔直 0 86 86
9 笔直 50 97 97
10 笔直 23 NaN 47
11 笔直 13 NaN 24
12 笔直 11 NaN 11

下面这行代码是我目前用来获取滚动总和的代码。

rolling_sum = df.groupby('Type', sort=False)['Value'].rolling(4, min_periods = 3).sum().shift(-3).reset_index()
rolling_sum = rolling_sum.rename(columns={'Value': 'Rolling Sum'})

extracted_col = rolling_sum['Rolling Sum']
df = df.join(extracted_col)

非常感谢您的帮助。

您可以尝试 运行 对每组的反向值求滚动总和,然后使用 min_periods 1:

df['Rolling Sum'] = df.groupby('Type', sort=False)['Value'].apply(lambda x: x[::-1].rolling(4, min_periods=1).sum()[::-1])

结果:

   Index        Type    Value   Rolling Sum
0      1        left        5          22.0
1      2        left        9          34.0
2      3        left        0          25.0
3      4        left        8          25.0
4      5        left       17          17.0
5      6    straight        7          61.0
6      7    straight        4          77.0
7      8    straight        0          86.0
8      9    straight       50          97.0
9     10    straight       23          47.0
10    11    straight       13          24.0
11    12    straight       11          11.0