我在 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 |
我附加的最后 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 人仍在排队。
- 等
有人有一些代码(或伪代码)以 pythonic 方式执行此操作,最好使用 Pandas 吗?
最佳答案
我已经准确地编写了您需要的代码,它将返回您期望的结果(我添加了一些行来验证它)。如果你想要超过 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
有关,即尚未Out
的In
数量。为了添加时间信息(因为 Supply
不知道 In
的年龄),我们添加了 Supply-2
列,它量化已经存在 2 天的 Supply
的数量。之后只有数学运算,才能知道最后 3 列的数量。
再见!
关于Python - 对 Pandas DataFrame 中的数据执行 FIFO 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39735579/