带有groupby的熊猫数据框滚动总和列

时间:2021-07-13 06:51:13

标签: python pandas dataframe data-science rolling-sum

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

但是,如果在下一个类型开始之前少于 4 行,我希望滚动总和仅使用剩余的行。例如,如果当前类型的当前行之后有 2 行,则总共使用 3 行作为滚动和。请参阅下表,了解我目前获得的内容和期望的内容。

<头>
索引 类型 价值 当前滚动总和 预期滚动总和
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)

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您可以尝试对每个组的反向值运行滚动总和,然后使用 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