我有一些潘达的数据看起来是这样的。
| 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列表示在多少天内有多少人从进程中走出来。所以口头上说..。
有谁有一些代码(或伪代码)可以用节奏曲的方式来完成这个任务,最好是使用Pandas?
发布于 2016-12-28 11:45:20
我已经编写了您需要的代码,它将返回您期望的结果(我添加了一些行来验证它)。如果您想要超过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的数量,而In并不是Out。为了添加时间信息(因为Supply不知道In的年龄),我们添加了Supply-2列,它量化了已经在这里2天的Supply的数量。只有数学之后,才能知道最后三栏的数量。
再见!
https://stackoverflow.com/questions/39735579
复制相似问题