[英]Pandas dataframe rolling sum column with groupby
我正在嘗試創建一個新列,該列在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)
我將衷心感謝您的幫助。
您可以嘗試對每個組的反向值運行滾動總和,然后使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.