熊猫创建自己的列

问题描述:

我想在熊猫中创建一个新列,但是这些值是通过引用其上方单元格中的值来计算的。我有一个名为return的列,实际上这个值应该是前一行的返回*值。熊猫创建自己的列

从概念上讲,我认为它应该是这样的,但这不起作用,我不知道如何得到它。

df2['value'] = [100 if x == 0 else x * y for x, y in zip(df2['return'], df2['value'].shift(1))] 

因此,数据看起来是这样的:

return 
0 
0.99756466142691 
0.99846199238689 
1.004349336899 
1.0018775199783 

我想这一点:

return   value 
0.0000000000 100.0000000000 
0.9975646614 99.7564661427 
0.9984619924 99.6030399383 
1.0043493369 100.0362471152 
1.0018775200 100.2240671677 

谢谢!

溶液用循环,因为需要先前值:

for i, row in df2.iterrows(): 
    if row['return'] == 0: 
     df2.loc[i, 'value'] = 100 
    else: 
     df2.loc[i, 'value'] = df2.loc[i,'return'] * df2.loc[i-1, 'value'] 

print (df2) 
    return  value 
0 0.000000 100.000000 
1 0.997565 99.756466 
2 0.998462 99.603040 
3 1.004349 100.036247 
4 1.001878 100.224067 

其中输入依赖于先前步骤的结果计算的迭代性质复杂化矢量。你也许可以使用与循环执行相同计算的函数来应用,但在幕后,这也将是一个循环。

+0

谢谢!这工作,感谢您使用iterrows的课程。 – WhitneyChia

+0

很高兴能为您提供帮助!美好的一天! – jezrael

尝试:

df.return.replace(0, 100).cumprod() 

你问的是累积产品。挑战在于你如何安排最初的作品。
注意:这是一个矢量化的解决方案,不需要循环。

df['value'] = df['return'].add(df['return'].eq(0)).cumprod().mul(100) 
df 

enter image description here