Pandas 最后四个值的总和不是 nan 值
Pandas sum of last four not nan values
我有一个非常大的数据框,我想添加一个列,该列由另一列的最后四个非 Nan 值组成。删除 Nan 行不是一个选项。
我想到了一些使用
df.apply(pd.Series.last_valid_index)
并将其与向上滚动 window 相结合,但也许有人有更好的选择。
低于期望的输出:
(将 ... 行视为 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
谢谢
看来你可以放弃 Nan 的并在 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()
输出:
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
我有一个非常大的数据框,我想添加一个列,该列由另一列的最后四个非 Nan 值组成。删除 Nan 行不是一个选项。
我想到了一些使用
df.apply(pd.Series.last_valid_index)
并将其与向上滚动 window 相结合,但也许有人有更好的选择。
低于期望的输出: (将 ... 行视为 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
谢谢
看来你可以放弃 Nan 的并在 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()
输出:
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