我的數據框看起來像這樣填寫列列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(),但我沒有成功。 –