2016-09-27 102 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列的数量后,才算数学。

看到你!