猿问

Pandas 最后四个值的总和而不是 nan 值

我有一个非常大的数据框,想要添加一个由另一列的最后四个非 Nan 值组成的列。删除 Nan 行不是一个选择。


我想到了一些使用


df.apply(pd.Series.last_valid_index)

并将其与上滚动窗口结合起来,但也许有人有更好的选择。


在所需输出下方:(将 ... 行视为 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

谢谢


烙印99
浏览 169回答 1
1回答

慕码人8056858

看起来你可以放弃 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 datadf['Sum'] = df.groupby('Name')['Sum'].ffill()输出:    Date Name  Val  Sum0   11.1    A  NaN  NaN1   11.1    B  NaN  NaN2   11.1    C  NaN  NaN3   12.1    A    1  NaN4   12.1    B    2  NaN5   12.1    C    4  NaN6   13.1    A  NaN  NaN7   13.1    B  NaN  NaN8   13.1    C  NaN  NaN9   12.2    A    2  NaN10  12.2    B    2  NaN11  12.2    C    3  NaN12  13.2    A  NaN  NaN13  13.2    B  NaN  NaN14  13.2    C  NaN  NaN15  14.2    A    4  NaN16  14.2    B    2  NaN17  14.2    C    4  NaN18  15.2    A  NaN  NaN19  15.2    B  NaN  NaN20  15.2    C  NaN  NaN21  16.2    A    7   1422  16.2    B    2    823  16.2    C    4   1524  17.2    A  NaN   1425  17.2    B  NaN    826  17.2    C  NaN   1527  18.2    A  NaN   1428  18.2    B  NaN    829  18.2    C  NaN   15
随时随地看视频慕课网APP

相关分类

Python
我要回答