Python - 对 Pandas DataFrame 中的数据执行 FIFO 操作

标签 python pandas

我在 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有关,即尚未OutIn数量。为了添加时间信息(因为 Supply 不知道 In 的年龄),我们添加了 Supply-2 列,它量化已经存在 2 天的 Supply 的数量。之后只有数学运算,才能知道最后 3 列的数量。

再见!

关于Python - 对 Pandas DataFrame 中的数据执行 FIFO 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39735579/

相关文章:

python - 如何从 Pandas 数据框中检索在其中一列末尾包含特定值的记录序列?

python - 我想限制 Tkinter 回调运行的频率

python - Plotly Scattermapbox : Is there a way to include some text above and below the markers?

python - 如何使用 scapy 模块发送请求并接受三个答案?

java - 多线程 python/ruby vs java?

python - 如何确定显示器刷新率?

python - pandas 匹配两列并创建另一列

python - 如何获取数据框中字段列表的前 3 次出现?

python - Pandas 有条件地以粗体格式设置字段

python - 获取 pandas 中的一行数据作为字典