Python - 在 Pandas DataFrame 中执行先进先出操作

4
我有一些Pandas中的数据,看起来像这样。
| 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 |

我追加的最后三列表示在多少天内完成了多少个流程。口头上说,...

  • 第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个留在队列中。
  • 以此类推。

是否有一些能够以Pythonic的方式、最好使用Pandas库实现的代码(或伪代码)?

1个回答

2

我已经编写了您所需的代码,它将返回您期望的结果(我添加了一些行以进行验证)。如果您需要超过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-2列,它量化了在此处停留两天的供应量的数量。之后只是数学计算,可以知道最后三列的数量。
再见!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接