我的数据框看起来像这样:
我将非常感谢您提供任何关于IT技术的建议。 更新 我尝试应用代码。
结果应该如下所示:
但是代码执行的结果并不是预期的:
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 NaN 0 NaN 200 322
55 2 30 NaN 70 NaN 100 100
56 3 25 NaN 0 NaN 400 110
57 4 15 NaN 0 NaN 100 300
58 5 10 NaN 0 NaN 100 180
59 6 40 NaN 0 NaN 100 100
...
我需要做以下事情:
从 scale = 1
开始,填充列 hold
的值,计算方法如下:
我取列 hold
中的前一个值,并从中减去来自列 cons
的当前单元格对应值,再加上来自列 supply
的对应值。
(对于列 hold
中对应于 scale = 1
的单元格,它将是 (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
。并将此差异写入列 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
...
我将非常感谢您提供任何关于IT技术的建议。 更新 我尝试应用代码。
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
...
但是代码执行的结果并不是预期的:
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
...
在hold = 370
之后出现了错误,但我不明白原因。