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
我正在尝试创建一个新列,以提供 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