接下来n行的熊猫总和

KOB*_*KOB 5 python pandas

我有一个如下所示的 DataFrame:

             ds         y
0    2017-02-07  0.154941
1    2017-02-08  0.110595
2    2017-02-09  0.044022
3    2017-02-10  0.283902
4    2017-02-11  0.121570
5    2017-02-12  0.000000
6    2017-02-13  0.020265
7    2017-02-14  0.053577
8    2017-02-15  0.080842
9    2017-02-16  0.022043
Run Code Online (Sandbox Code Playgroud)

我现在正在尝试创建一个新列“next_3”,它是y当天之后接下来 3 天的值的总和。

我正在使用以下方法实现这一目标:

df['next_3'] = df['y'].shift(-3).rolling(3).sum()
Run Code Online (Sandbox Code Playgroud)

产生这个:

           ds         y     label
0  2017-02-07  0.154941       NaN
1  2017-02-08  0.110595       NaN
2  2017-02-09  0.044022  0.405472
3  2017-02-10  0.283902  0.141836
4  2017-02-11  0.121570  0.073842
5  2017-02-12  0.000000  0.154685
6  2017-02-13  0.020265  0.156462
7  2017-02-14  0.053577       NaN
8  2017-02-15  0.080842       NaN
9  2017-02-16  0.022043       NaN
Run Code Online (Sandbox Code Playgroud)

我理解为什么最后 3 行有NaN值,因为接下来的 3 行不可用,但是为什么前 2 行在NaN可以计算这些值时有值?

如何更正我的shift().rolling().sum()呼叫以便也计算前两行?

jez*_*ael 9

使用参数min_periods=1

df['next_3'] = df['y'].shift(-3).rolling(3, min_periods=1).sum()
print (df)
           ds         y    next_3
0  2017-02-07  0.154941  0.283902
1  2017-02-08  0.110595  0.405472
2  2017-02-09  0.044022  0.405472
3  2017-02-10  0.283902  0.141835
4  2017-02-11  0.121570  0.073842
5  2017-02-12  0.000000  0.154684
6  2017-02-13  0.020265  0.156462
7  2017-02-14  0.053577  0.102885
8  2017-02-15  0.080842  0.022043
9  2017-02-16  0.022043       NaN
Run Code Online (Sandbox Code Playgroud)

或者先使用滚动然后移动:

df['next_3'] = df['y'].rolling(3).sum().shift(-3)
print (df)
           ds         y    next_3
0  2017-02-07  0.154941  0.438519
1  2017-02-08  0.110595  0.449494
2  2017-02-09  0.044022  0.405472
3  2017-02-10  0.283902  0.141835
4  2017-02-11  0.121570  0.073842
5  2017-02-12  0.000000  0.154684
6  2017-02-13  0.020265  0.156462
7  2017-02-14  0.053577       NaN
8  2017-02-15  0.080842       NaN
9  2017-02-16  0.022043       NaN
Run Code Online (Sandbox Code Playgroud)