2016-09-27 104 views
3

我在熊貓中有一些看起來像這樣的數據。Python - 對熊貓數據框中的數據執行FIFO操作

| DAY | IN | OUT | 
|-----|-----|-----| 
| 1 | 100 | 50 | 
| 2 | 20 | 60 | 
| 3 | 10 | 5 | 
| 4 | 5 | 15 | 

這表示物品進入隊列的當天以及有多少隊列出隊。當事情進入隊列時,我沒有辦法跟蹤它們,所以我假設它們按順序處理,並且你有一個FIFO(先進先出)類型的操作。

我想要做的是執行一個FIFO操作,以便我可以看到多少天的操作。所以作爲一個例子...

| DAY | IN | OUT | 1 | 2 | 3 | 
|-----|-----|-----|-----|-----|-----| 
| 1 | 100 | 50 | 50 | 0 | 0 | 
| 2 | 20 | 60 | 10 | 50 | 0 | 
| 3 | 10 | 5 | 0 | 5 | 0 | 
| 4 | 5 | 15 | 0 | 10 | 5 | 

我追加的最後3列表示在多少天內出現了多少個進程。所以口頭上說...

  • 在第1天,100進去了,50出來了。因此,1天內處理了50個,50個仍在隊列中。
  • 第2天,20人進去了,60人出來了。因此,先前排隊的50人耗盡了2天。剩餘的10個在1天內完成。 10人仍然排隊等候。
  • 第3天,有10人進來,5人出來。因此,先前排隊的10人減少到5人。出來的5人在2天內參加比賽。 15人仍然排隊等候。
  • 第4天,5人進去了,15人出來了。因此,先前的15號隊列已經耗盡。 5花了3天才完成,10花了2天。 5人仍然排隊等候。

任何人有一些代碼(或僞代碼)在Python的方式來做到這一點,優選地使用熊貓?

回答

1

我已經準確地編碼了你需要的東西,它會返回你期望的結果(我已經添加了一些行來驗證它)。如果你想潛伏期超過3天,你可以添加Supply列,以及(這是很容易理解的事,它總是同樣的事情):

import pandas as pd 

df = pd.DataFrame() 
df['Day'] = [1, 2, 3, 4, 5, 6, 7] 
df['In'] = [100, 20, 10, 5, 10, 10, 10] 
df['Out'] = [50, 60, 5, 15, 5, 0, 20] 

df['Supply'] = df.apply(lambda row: row['In']-row['Out'], axis=1) 
df['Supply'] = df['Supply'].cumsum().shift(1).fillna(0) 
df['1'] = df.apply(lambda row: row['Out'] - row['Supply'] if row['Supply'] < row['Out'] else 0, axis=1) 
df['Supply-2'] = df.apply(lambda row: row['Supply'] - row['Out'] + row['1'], axis=1) 
df['Supply-2'] = df['Supply-2'].shift(1).fillna(0) 
df['2'] = df.apply(lambda row: row['Out'] - row['1'] - row['Supply-2'], axis=1) 
df['3'] = df.apply(lambda row: row['Out'] - row['1'] - row['2'], axis=1) 

print(df[['Day', 'In', 'Out', '1', '2', '3']]) 

返回:

Day In Out  1  2  3 
0 1 100 50 50.0 0.0 0.0 
1 2 20 60 10.0 50.0 0.0 
2 3 10 5 0.0 5.0 0.0 
3 4 5 15 0.0 10.0 5.0 
4 5 10 5 0.0 5.0 0.0 
5 6 10 0 0.0 0.0 0.0 
6 7 10 20 0.0 10.0 10.0 

說明:一切都是關於Supply這是數量In其中不是Out。爲了添加時間信息(因爲Supply不知道In的年齡),我們添加Supply-2列,其量化Supply已經在這裏2天的數量。知道最後3列的數量後,纔算數學。

看到你!