下n行的熊猫总和

时间:2018-12-18 10:22:23

标签: 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

我现在正在尝试创建一个新列'next_3',该列是当日之后三天内y值的总和。

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

df['next_3'] = df['y'].shift(-3).rolling(3).sum()

产生以下结果:

           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

我了解为什么后三行没有NaN值,因为后三行不可用,但是为什么可以计算出前两行具有NaN值呢?

如何纠正我的shift().rolling().sum()通话,以便同时计算前两行?

1 个答案:

答案 0 :(得分:3)

使用参数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

或者先滚动然后再移位:

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