我有一个如下所示的DataFrame:
我想要的是计算以下操作,在循环中描述:
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'列?
答案 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