Python:选择具有不同索引的元素并将它们存储在Pandas中的新Dataframe列中

时间:2017-10-13 17:25:01

标签: python pandas dataframe

我有一个如下所示的DataFrame:

enter image description here

我想要的是计算以下操作,在循环中描述:

for ii in range(0,len(df['Avg'])):
    if ii==0:
        df['Return'][ii]=0
    else:
        df['Return'][ii] = (df['Avg'][ii])/(df['Avg'][ii-1])-1

我想使用' present'和之前的'元素来自' Avg'用于执行该操作的列,但我收到此错误:

  

正在尝试在DataFrame

的切片副本上设置值      

请参阅文档中的警告:   http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy   df [' Return'] [ii] = 0 C:/ Users / julio / Desktop / Python Scripts / Euclid   Capital Scripts / DukasCopy / duka_test:34:SettingWithCopyWarning:A   尝试在DataFrame

的切片副本上设置值      

请参阅文档中的警告:   http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy   df [' Return'] [ii] =(df [' Avg'] [ii])/(df [' Avg'] [ii-1]) -1

是否有另一种方法可以达到我想要的效果并将这些值存储在' Return'列?

1 个答案:

答案 0 :(得分:1)

您可以使用.pct_change

df.loc[:, 'Return'] = df['Avg'].pct_change()

或者,从前导零而不是NaN开始,链.fillna

df.loc[:, 'Return'] = df['Avg'].pct_change().fillna(0.)

至于你所看到的警告,那里有很多关于这里发生了什么的信息:

在您的情况下,使用df['Return'][ii]是导致这种情况的原因。您正在使用链式索引,使用.loc.iloc会更安全。

示例:

df = pd.DataFrame({'Avg' : np.random.rand(10) + 1},
                  index=pd.date_range('2017-02', periods=10))
df.loc[:, 'Return'] = df['Avg'].pct_change().fillna(0.)
print(df)
                Avg   Return
2017-02-01  1.86389  0.00000
2017-02-02  1.19992 -0.35623
2017-02-03  1.08414 -0.09649
2017-02-04  1.17281  0.08179
2017-02-05  1.30422  0.11204
2017-02-06  1.59484  0.22284
2017-02-07  1.63399  0.02455
2017-02-08  1.99155  0.21883
2017-02-09  1.54733 -0.22305
2017-02-10  1.50584 -0.02682