我正在尝试为我的DataFrame实现以下算法:
if Tenure==0:
s=1
else:
s = (previous value from "s") * (1-previous value from "h")
列s
计算为h
的函数,初始值为1.
输入数据框:
popt stopt popcum h s
Tenure
0.0 2383 508.0 5067890 0.000100 1
1.0 18358 17310.0 5065507 0.003417 0
2.0 16742 15103.0 5047149 0.002992 0
3.0 13298 11361.0 5030407 0.002258 0
4.0 9566 9522.0 5017109 0.001898 0
result3["s"]=result3.apply(funkcyjka)
要跳过第一个条件我刚编辑第一行因为它是唯一一个Tenure = 0
以下是我的想法:
def funkcyjka(res):
x=0
lol=(res["s"].iloc[x])*(1-(res["h"].iloc[x]))
x+=1
return lol
但它并没有达到我的预期。如何将此功能实现到我的Dataframe?
答案 0 :(得分:3)
如果你在纸上追踪这一点,这就是s
每一行的实际计算结果:
1
1 * (1 - h0)
(1 - h0) * (1 - h1)
(1 - h0) * (1 - h1) * (1 - h2)
...
所以,你在这里需要shift
+ cumprod
:
df['s'] = (1 - df['h'].shift()).fillna(1).cumprod()
df
popt stopt popcum h s
Tenure
0.0 2383 508.0 5067890 0.000100 1.000000
1.0 18358 17310.0 5065507 0.003417 0.999900
2.0 16742 15103.0 5047149 0.002992 0.996483
3.0 13298 11361.0 5030407 0.002258 0.993502
4.0 9566 9522.0 5017109 0.001898 0.991259