通过迭代创建新的df列

时间:2017-03-24 18:03:42

标签: python pandas iteration

我有一个数据框,df看起来像这样

            Open  High   Low  Close   Volume
Date                                        
2007-03-22  2.65  2.95  2.64   2.86   176389
2007-03-23  2.87  2.87  2.78   2.78    63316
2007-03-26  2.83  2.83  2.51   2.52    54051
2007-03-27  2.61  3.29  2.60   3.28   589443
2007-03-28  3.65  4.10  3.60   3.80  1114659
2007-03-29  3.91  3.91  3.33   3.57   360501
2007-03-30  3.70  3.88  3.66   3.71   185787

我正在尝试创建一个新列,它将从每个df.Open值提前5天获取df.Open值并减去它。

所以我使用的循环是:

for i in range(0, len(df.Open)):  #goes through indexes values
    df['5days'][i]=df.Open[i+5]-df.Open[i]    #I use those index values to locate 

但是,这个循环会产生错误。

KeyError: '5days'

不确定原因。我通过移除df ['5days'] [i]来暂时工作,但它看起来非常慢。不确定是否有更有效的方法来做到这一点。

谢谢。

2 个答案:

答案 0 :(得分:4)

我认为shift需要sub

df['5days'] = df.Open.shift(5).sub(df.Open)
print (df)
            Open  High   Low  Close   Volume  5days
Date                                               
2007-03-22  2.65  2.95  2.64   2.86   176389    NaN
2007-03-23  2.87  2.87  2.78   2.78    63316    NaN
2007-03-26  2.83  2.83  2.51   2.52    54051    NaN
2007-03-27  2.61  3.29  2.60   3.28   589443    NaN
2007-03-28  3.65  4.10  3.60   3.80  1114659    NaN
2007-03-29  3.91  3.91  3.33   3.57   360501  -1.26
2007-03-30  3.70  3.88  3.66   3.71   185787  -0.83

或者可能需要使用移位列减去Open

df['5days'] = df.Open.sub(df.Open.shift(5))
print (df)
            Open  High   Low  Close   Volume  5days
Date                                               
2007-03-22  2.65  2.95  2.64   2.86   176389    NaN
2007-03-23  2.87  2.87  2.78   2.78    63316    NaN
2007-03-26  2.83  2.83  2.51   2.52    54051    NaN
2007-03-27  2.61  3.29  2.60   3.28   589443    NaN
2007-03-28  3.65  4.10  3.60   3.80  1114659    NaN
2007-03-29  3.91  3.91  3.33   3.57   360501   1.26
2007-03-30  3.70  3.88  3.66   3.71   185787   0.83
df['5days'] = -df.Open.sub(df.Open.shift(-5))
print (df)
            Open  High   Low  Close   Volume  5days
Date                                               
2007-03-22  2.65  2.95  2.64   2.86   176389   1.26
2007-03-23  2.87  2.87  2.78   2.78    63316   0.83
2007-03-26  2.83  2.83  2.51   2.52    54051    NaN
2007-03-27  2.61  3.29  2.60   3.28   589443    NaN
2007-03-28  3.65  4.10  3.60   3.80  1114659    NaN
2007-03-29  3.91  3.91  3.33   3.57   360501    NaN
2007-03-30  3.70  3.88  3.66   3.71   185787    NaN

答案 1 :(得分:4)

使用diff

df['5Days'] = df.Open.diff(5)
print(df)

            Open  High   Low  Close   Volume  5Days
Date                                               
2007-03-22  2.65  2.95  2.64   2.86   176389    NaN
2007-03-23  2.87  2.87  2.78   2.78    63316    NaN
2007-03-26  2.83  2.83  2.51   2.52    54051    NaN
2007-03-27  2.61  3.29  2.60   3.28   589443    NaN
2007-03-28  3.65  4.10  3.60   3.80  1114659    NaN
2007-03-29  3.91  3.91  3.33   3.57   360501   1.26
2007-03-30  3.70  3.88  3.66   3.71   185787   0.83

但是,根据您的代码,您可能希望向前看并重新调整结果。在那种情况下

df['5Days'] = -df.Open.diff(-5)
print(df)

            Open  High   Low  Close   Volume  5days
Date                                               
2007-03-22  2.65  2.95  2.64   2.86   176389   1.26
2007-03-23  2.87  2.87  2.78   2.78    63316   0.83
2007-03-26  2.83  2.83  2.51   2.52    54051    NaN
2007-03-27  2.61  3.29  2.60   3.28   589443    NaN
2007-03-28  3.65  4.10  3.60   3.80  1114659    NaN
2007-03-29  3.91  3.91  3.33   3.57   360501    NaN
2007-03-30  3.70  3.88  3.66   3.71   185787    NaN