首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -对Pandas DataFrame中的数据执行FIFO操作

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

Stack Overflow用户
提问于 2016-09-27 22:56:24
回答 1查看 2.6K关注 0票数 4

我有一些潘达的数据看起来是这样的。

代码语言:javascript
复制
| DAY | IN  | OUT |
|-----|-----|-----|
|   1 | 100 |  50 |
|   2 |  20 |  60 |
|   3 |  10 |   5 |
|   4 |   5 |  15 |

这表示某一项进入队列的日期,以及从队列中出现了多少。当事情进入队列时,我实际上没有跟踪它们的方法,因此我假设它们是按顺序处理的,并且您有一个FIFO (先进先出)类型操作。

我想要做的是执行一个FIFO操作,这样我就可以看到操作花费了多少天。举个例子..。

代码语言:javascript
复制
| 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列表示在多少天内有多少人从进程中走出来。所以口头上说..。

  • 第一天,100人进去,50人出来。因此,50只在1天内被处理,50只还在排队。
  • 第二天,20人进去,60人出来。因此,先排完50人的队伍,用了2天的时间。其余的10个出来,在1天内完成。仍有10人排队。
  • 第三天,10人进去,5人出来。因此,原来的10排排成了5队,这5名选手在两天内就完成了比赛。15人仍在排队。
  • 第4天,5人进去,15人出来。因此,先前的15队列已经耗尽。5天完成,10天2天。5人仍在排队。
  • 等。

有谁有一些代码(或伪代码)可以用节奏曲的方式来完成这个任务,最好是使用Pandas?

EN

回答 1

Stack Overflow用户

发布于 2016-12-28 11:45:20

我已经编写了您需要的代码,它将返回您期望的结果(我添加了一些行来验证它)。如果您想要超过3天的延迟时间,也可以添加Supply列(很容易理解要做什么,它总是一样的):

代码语言:javascript
复制
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']])

返回:

代码语言:javascript
复制
   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的数量。只有数学之后,才能知道最后三栏的数量。

再见!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39735579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档