我在下面有示例数据框
perc 2018_norm
0 0.009069 27.799849
1 0.011384 0.00
2 -0.000592 0.00
3 -0.002667 0.00
2018_norm
第一行的值来自另一个DataFrame。然后,我想使用2018_norm
列中的百分比变化和perc
列中上一行的值来计算2018_norm
列DataFrame末尾的第二行的值,我目前可以使用For循环实现以下结果:
perc 2018_norm
0 0.009069 27.799849
1 0.011384 28.116324
2 -0.000592 28.099667
3 -0.002667 28.024713
4 -0.006538 27.841490
对于DataFrames上的循环来说速度很慢,所以我知道我缺少一些基本的知识,但是我的google搜索没有得到我想要的东西。
我尝试了y1df['2018_norm'].iloc[1:] = (y1df['perc'] * y1df['2018_norm'].shift(1)) + y1df['2018_norm'].shift(1)
的各种变体,它们仅产生:
perc 2018_norm
0 0.009069 27.799849
1 0.011384 28.116324
2 -0.000592 0.00
3 -0.002667 0.00
4 -0.006538 0.00`
我想念什么?
编辑:为明确起见,基本的For循环和df.iloc
并不可取,带有迭代次数的for循环大大加快了计算速度,因此使用该功能的for循环是我使用的绝佳解决方案。文本的回应也直接回答了我原本不想问的问题。
答案 0 :(得分:3)
这只是cumprod
s=(df.perc.shift(-1).fillna(1)+1).cumprod().shift().fillna(1)*df['2018_norm'].iloc[0]
df['2018_norm']=s
df
Out[390]:
perc 2018_norm
0 0.009069 27.799849
1 0.011384 28.116322
2 -0.000592 28.099678
3 -0.002667 28.024736
答案 1 :(得分:2)
您可以使用df.iterrows()快速遍历熊猫数据框:
for idx, row in y1df.iterrows():
if idx > 0: # Skip first row
y1df.loc[idx, '2018_norm'] = (1 + row['perc']) * y1df.loc[idx-1, '2018_norm']
print(y1df)
perc 2018_norm
0 0.009069 27.799849
1 0.011384 28.116322
2 -0.000592 28.099678
3 -0.002667 28.024736