我的数据框看起来像这样填写列列hold
,其值如下计算:使用在列,且前值的大熊猫一些计算
我取hold
列中的先前值,并从列中减去当前单元格的相应值cons
并从列supply
中添加相应的值。
(对于在对应于scale = 1
列hold
的细胞将是(300 - 20) + 0 = 280
, 为下一个单元(280 - 30) + 70) = 320
,对下一个单元(320 - 25) + 0) = 295
等)
如果在列hold
值小于比列s_res
中的相应值,然后到下一个单元,我必须加上列s_res
和z_res
列中的对应的下一个单元值之间的差值。
例如,hold
列中的值是295
,其中scale = 3
。该值小于列s_res = 400
中的值。然后我需要计算下一个值:(295 - 15) + 0 + (300 - 100) = 480
。并且在s_res
和z_res
之间的这个差值写在add.supply
列中。
我需要hold
列中的每个新计算值检查它是否小于s_res
列中的值。
结果应该是这样的:
scale cons hold supply add.supply s_res z_res
48 -5 NaN NaN NaN NaN NaN NaN
49 -4 NaN NaN NaN NaN NaN NaN
50 -3 NaN NaN NaN NaN NaN NaN
51 -2 NaN NaN NaN NaN NaN NaN
52 -1 NaN NaN NaN NaN NaN NaN
53 0 0 300 0 NaN 100 200
54 1 20 280 0 NaN 200 322
55 2 30 320 70 NaN 100 100
56 3 25 295 0 NaN 400 110
57 4 15 480 0 200 100 300
58 5 10 470 0 NaN 100 180
59 6 40 430 0 NaN 100 100
...
我会的任何意见表示感谢。
UPD我试图代码
df['hold'] = df.hold.fillna(method='ffill') - df.cons.cumsum() + df.supply.cumsum()
df['add.supply'] = np.where(df.hold.shift() < df.s_res.shift(), df.z_res - df.s_res, np.nan)
df['hold'] = df.hold + df['add.supply'].fillna(0).cumsum()
适用于更大的数据帧,我有问题
我的新数据帧
scale cons hold supply add.supply s_res z_res
0 0 0 300 0 NaN 100 200
1 1 20 NaN 0 NaN 200 322
2 2 30 NaN 70 NaN 100 100
3 3 25 NaN 0 NaN 400 110
4 4 15 NaN 0 NaN 100 300
5 5 10 NaN 0 NaN 100 180
6 6 40 NaN 0 NaN 100 100
7 7 60 NaN 0 NaN 300 400
8 8 50 NaN 0 NaN 245 300
9 9 70 NaN 0 NaN 300 600
10 10 50 NaN 0 NaN 143 228
...
结果应该是以下:
scale cons hold supply add.supply s_res z_res
0 0 0 300 0 NaN 100 200
1 1 20 280 0 NaN 200 322
2 2 30 320 70 NaN 100 100
3 3 25 295 0 NaN 400 110
4 4 15 480 0 200 100 300
5 5 10 470 0 NaN 100 180
6 6 40 430 0 NaN 100 100
7 7 60 370 0 NaN 300 400
8 8 50 320 0 NaN 245 300
9 9 70 250 0 NaN 300 600
10 10 50 285 0 85 143 228
...
但代码执行的结果是不应该的:hold = 370
后
scale cons hold supply add.supply s_res z_res
0 0 0 300 0 NaN 100 200
1 1 20 280 0 NaN 200 322
2 2 30 320 70 NaN 100 100
3 3 25 295 0 NaN 400 110
4 4 15 480 0 200 100 300
5 5 10 470 0 NaN 100 180
6 6 40 430 0 NaN 100 100
7 7 60 370 0 NaN 300 400
8 8 50 375 0 55 245 300
9 9 70 605 0 300 300 600
10 10 50 640 0 85 143 228
...
错误出现,但我不明白为什么。
你能解释一下你”有没有试图做到这一点?这可以帮助人们找到他们最有用的解释。 – ASGM
@ASGM我道歉,但我恐怕没有完全理解你的问题。然而,任务的开始会造成最大的困难。我不明白如何使用列'hold'中的前一个值,并且同时从中减去与当前正在计算的单元格相对应的'cons'列中的值。无论如何,计算总是从'scale = 1'的地方开始。我尝试使用shift(),但我没有成功。 –