TransWikia.com

Pandas sum of last four not nan values

Stack Overflow Asked by Luca R on January 20, 2021

I have a very large dataframe and want to add a column which consists of the last four non-Nan values of another column. Dropping the Nan rows is not an option.

I thought of something using

df.apply(pd.Series.last_valid_index)

and combining it with an uprolling window, but maybe someone has a better take.

Below the desired output:
(Consider the … row as Nan)

Date   Name  Val  Sum
11.1   A     Nan  Nan
11.1   B     Nan  Nan
11.1   C     Nan  Nan
12.1   A     1    Nan
12.1   B     2    Nan
12.1   C     4    Nan
13.1   A     Nan  Nan
13.1   B     Nan  Nan
13.1   C     Nan  Nan
...    ...   ...  ... 
12.2   A     2    Nan
12.2   B     2    Nan
12.2   C     3    Nan
13.2   A     Nan  Nan
13.2   B     Nan  Nan
13.2   C     Nan  Nan
14.2   A     4    Nan
14.2   B     2    Nan
14.2   C     4    Nan
15.2   A     Nan  Nan
15.2   B     Nan  Nan
15.2   C     Nan  Nan
16.2   A     7    14
16.2   B     2    8
16.2   C     4    15
17.2   A     Nan  14
17.2   B     Nan  8
17.2   C     Nan  15
18.2   A     Nan  14
18.2   B     Nan  8
18.2   C     Nan  15

Thank you

One Answer

It looks like you can just drop Nan's and rolling on groupby:

df['Sum'] = df[df.Val.notna()].groupby('Name')['Val'].transform(lambda x: x.rolling(4).sum())

# Then `ffill` on groupby of the full data
df['Sum'] = df.groupby('Name')['Sum'].ffill()

Output:

    Date Name  Val  Sum
0   11.1    A  NaN  NaN
1   11.1    B  NaN  NaN
2   11.1    C  NaN  NaN
3   12.1    A    1  NaN
4   12.1    B    2  NaN
5   12.1    C    4  NaN
6   13.1    A  NaN  NaN
7   13.1    B  NaN  NaN
8   13.1    C  NaN  NaN
9   12.2    A    2  NaN
10  12.2    B    2  NaN
11  12.2    C    3  NaN
12  13.2    A  NaN  NaN
13  13.2    B  NaN  NaN
14  13.2    C  NaN  NaN
15  14.2    A    4  NaN
16  14.2    B    2  NaN
17  14.2    C    4  NaN
18  15.2    A  NaN  NaN
19  15.2    B  NaN  NaN
20  15.2    C  NaN  NaN
21  16.2    A    7   14
22  16.2    B    2    8
23  16.2    C    4   15
24  17.2    A  NaN   14
25  17.2    B  NaN    8
26  17.2    C  NaN   15
27  18.2    A  NaN   14
28  18.2    B  NaN    8
29  18.2    C  NaN   15

Correct answer by Quang Hoang on January 20, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP