【问题标题】:Pandas dataframe rolling sum column with groupby带有 groupby 的 Pandas 数据框滚动总和列
【发布时间】:2021-09-22 05:34:16
【问题描述】:

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

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

Index Type Value Current Rolling Sum Expected Rolling Sum
1 left 5 22 22
2 left 9 34 34
3 left 0 NaN 25
4 left 8 NaN 25
5 left 17 NaN 17
6 straight 7 61 61
7 straight 4 77 77
8 straight 0 86 86
9 straight 50 97 97
10 straight 23 NaN 47
11 straight 13 NaN 24
12 straight 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)

非常感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

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

    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
    

    【讨论】:

    • 完美运行。非常感谢。
    • @runraver:没问题,乐于助人:)
    猜你喜欢
    • 2020-02-22
    • 2021-08-01
    • 2017-04-03
    • 1970-01-01
    • 2019-11-15
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多