我有一个如下所示的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()
通话,以便同时计算前两行?
答案 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