没有For循环的熊猫列的顺序计算

时间:2019-03-15 19:04:48

标签: python pandas

我在下面有示例数据框

        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循环是我使用的绝佳解决方案。文本的回应也直接回答了我原本不想问的问题。

2 个答案:

答案 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