我创建了一个小数据框,我想将0.99乘以上一行,依此类推,但前提是“ IF case”为true,否则将x [i]放进去。
在:
1
6
2
8
4
出局:
1.00
0.99
2.00
1.98
1.96
在一个人的帮助下,基于类似的问题,我尝试了以下操作,但不起作用。
x = pd.DataFrame([1, 6, 2, 8, 4])
y = np.zeros(x.shape)
yd = pd.DataFrame(y)
yd = np.where(x<3, x ,pd.Series(.99, yd.index).cumprod() / .99)
有什么主意吗?谢谢
答案 0 :(得分:4)
这更像是groupby
问题,当值小于3时,您将重置生产过程
y=x[0]
mask=y<3
y.where(mask,0.99).groupby(mask.cumsum()).cumprod()
Out[122]:
0 1.0000
1 0.9900
2 2.0000
3 1.9800
4 1.9602
Name: 0, dtype: float64
至少我们这里有for循环(如果上述方法不起作用)
your=[]
for t,v in enumerate(x[0]):
if v < 3:
your.append(v)
else:
your.append(your[t-1]*0.99)
your
Out[129]: [1, 0.99, 2, 1.98, 1.9602]
答案 1 :(得分:0)
这将检查当前行中x
的值是否小于3。如果是,则将其保持不变,否则将前一行乘以0.99。
x = pd.DataFrame([1, 6, 2, 8, 4])
x['out'] = np.where(x[0] <3, x[0], x[0].shift(1)*0.99)
输出:
x['out']
0 1.00
1 0.99
2 2.00
3 1.98
4 7.92