8-Bit Borges
8-Bit Borges

Reputation: 10033

Pandas - rolling sum of last N elements with condition

The following line:

df['moment'] = df.groupby('team').P.apply(lambda x : x.rolling(5).sum().fillna(0))

Generates the following dataframe, with a new column 'moment', which has the rolling sum of the past 5 'P' points:


          round          team  P   GP   GC   moment
0            1       Flamengo  0  0.0  1.0   0.0
1            2       Flamengo  0  0.0  3.0   0.0
2            3       Flamengo  3  1.0  0.0   0.0
3            4       Flamengo  1  1.0  1.0   0.0
4            5       Flamengo  1  1.0  1.0   5.0
5            6       Flamengo  3  1.0  0.0   8.0
6            7       Flamengo  3  5.0  3.0  11.0
7            8       Flamengo  3  2.0  1.0  11.0
8            9       Flamengo  3  2.0  1.0  13.0
9           10       Flamengo  0  0.0  2.0  12.0
10          11       Flamengo  3  2.0  1.0  12.0
11          12       Flamengo  1  1.0  1.0  10.0
12          13       Flamengo  3  3.0  1.0  10.0
13          14       Flamengo  3  3.0  0.0  10.0
14          15       Flamengo  3  2.0  1.0  13.0
15          16       Flamengo  1  1.0  1.0  11.0
16          17       Flamengo  3  5.0  1.0  13.0
17          18       Flamengo  1  2.0  2.0  11.0
18          19       Flamengo  0  1.0  4.0   8.0
19          20       Flamengo  0  0.0  4.0   5.0

But I need to apply the sum of the last 4, 3, 2 and 1 'P' as well, up to index 4, when we haven't reached N=5 yet. At the moment it is 0, which is wrong...

how do I tweak the code above in order to achieve this?


Desired result:

          round          team  P   GP   GC   moment
0            1       Flamengo  0  0.0  1.0   0.0
1            2       Flamengo  0  0.0  3.0   0.0
2            3       Flamengo  3  1.0  0.0   3.0
3            4       Flamengo  1  1.0  1.0   4.0
4            5       Flamengo  1  1.0  1.0   5.0
5            6       Flamengo  3  1.0  0.0   8.0
6            7       Flamengo  3  5.0  3.0  11.0
7            8       Flamengo  3  2.0  1.0  11.0
8            9       Flamengo  3  2.0  1.0  13.0
9           10       Flamengo  0  0.0  2.0  12.0
10          11       Flamengo  3  2.0  1.0  12.0
11          12       Flamengo  1  1.0  1.0  10.0
12          13       Flamengo  3  3.0  1.0  10.0
13          14       Flamengo  3  3.0  0.0  10.0
14          15       Flamengo  3  2.0  1.0  13.0
15          16       Flamengo  1  1.0  1.0  11.0
16          17       Flamengo  3  5.0  1.0  13.0
17          18       Flamengo  1  2.0  2.0  11.0
18          19       Flamengo  0  1.0  4.0   8.0
19          20       Flamengo  0  0.0  4.0   5.0

Upvotes: 1

Views: 464

Answers (1)

noah
noah

Reputation: 2776

Just set a minimum number of periods. The default None sets min_periods=window which in this case is 5. See docs.

df['moment'] = df.groupby('team').P.apply(lambda x : x.rolling(5, min_periods=1).sum().fillna(0))

.rolling(5, 1)works also at a loss of readability.

Upvotes: 1

Related Questions