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
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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP