pandas 比较三个数据框以评估多个标准

wyyhbhjk  于 2022-11-20  发布在  其他
关注(0)|答案(1)|浏览(102)

我 有 三 个 数据 帧 :

  • ob ( Orderbook ) - 包含 零件 编号 、 零件 到期 周 数 和 生产 零件 所 需 小时 数 的 订单 。

| 部件 编号|到期 周|构建 小时 数|
| - -| - -| - -|
| A 级|小 行星 2022 - 46|四 个|
| A 级|小 行星 2022 - 46|五 个|
| 乙|小 行星 2022 - 46|八 个|
| C 语言|小 行星 2022 - 47|一 点 六|

  • osm ( 操作 员 技能 矩阵 ) - 包含 操作 员 姓名 和 零件 号 的 技能 矩阵

| 操作 员|零件 编号|
| - -| - -|
| Mr.One |A 级|
| Mr.One |乙|
| Mr.Two |A 级|
| Mr.Two |乙|
| 三 太太|C 语言|

  • ah ( 可用 小时 数 ) - 包含 操作 员 在 给定 周 内 可 工作 小时 数 的 列表

| 操作 员|年 - 年 - 月|小时 数|
| - -| - -| - -|
| Mr.One |2022 年 至 45 年|四十|
| Mr.One |小 行星 2022 - 46|三十五|
| Mr.Two |小 行星 2022 - 46|三十七|
| Mr.Two |小 行星 2022 - 47|三十九|
| 三 太太|小 行星 2022 - 47|四十|
| 三 太太|小 行星 2022 - 48|四十五|
我 试 着 计算 出 每周 是否 有 足够 的 操作 员 , 有 合适 的 技能 , 工作 足够 的 时间 来 完成 订单 簿 上 的 所有 订单 。 如果 没有 , 找出 无法 完成 的 订单 。
一 步 一 步 看 起来 会 像 这样 :
1.取 订单 簿 第 一 行 的 零件 号 。
1.搜索 技能 矩阵 , 找到 可以 构建 该 部件 的 操作 员 列表 。
1.搜索 工时 表 , 检查 操作 员 在 订单 到期 的 那 一 周 是否 有 可用 的 工时 。
1.如果 操作 员 有 可用 的 小时 数 , 则 将 其 姓名 添加 到 订单 簿 的 该行 。
1.从 Avalible Hours df 中 的 Avalible 小时 数 中 减去 订单 簿 中 的 Build 小时 数 。
1.对 订单 簿 中 的 每 一 行 重复 此 操作 , 直到 所有 订单 都 有 名称 或 没有 剩余 的 可用 小时 数 。
我 唯一 能 想到 的 尝试 是 一 堆 嵌套 的 for 循环 , 但是 由于 有 数千 行 , 完成 一 次 迭代 需要 大约 45 分钟 , 如果 不是 几 周 的 话 , 完成 整个 过程 需要 几 天 。

#for each row in the orderbook
for i, rowi in ob_sum_hours.iterrows():
    #for each row in the operator skill matrix
    for j, rowj in osm.iterrows():
        #for each row in the avalible operator hours
        for y, rowy in aoh.iterrows():
            if(rowi['Material']==rowj['MATERIAL'] and rowi['ProdYYYYWW']==rowy['YYYYWW'] and rowj['Operator']==rowy['Operator'] and rowy['Hours'] > 0):`
        rowy['Hours'] -=rowi['PlanHrs']
        rowi['HoursAllocated'] = rowi['Operator']

中 的 每 一 个
最终 结果 如下 所 示 :
| 部件 编号|到期 周|构建 小时 数|操作 员|
| - -| - -| - -| - -|
| A 级|小 行星 2022 - 46|四 个| Mr.One |
| A 级|小 行星 2022 - 46|五 个| Mr.One |
| 乙|小 行星 2022 - 46|八 个| Mr.Two |
| C 语言|小 行星 2022 - 47|一 点 六| Mrs.Three |
有 没有 更 好 的 方法 来 实现 这 一 点 ?

ej83mcc0

ej83mcc01#

每一条线上都有一个线圈。
groupby(Orderbook.index)按索引分组,即my_func遍历每一行,仍然比循环好。
在“aaa”列表中,我们将获得匹配的唯一运算符列表。在“bbb”列表中,筛选可用依据:'YYYYWW'、'Operator'(使用isin作为唯一运算符列表)和'Hours'大于0。进一步在循环中,使用'bbb'索引,我们检查空闲时间,如果'ava'大于零,则使用显式索引loc设置值。

import pandas as pd

Orderbook = pd.read_csv('Orderbook.csv', header=0)
Operator = pd.read_csv('Operator.csv', header=0)
Avaliable= pd.read_csv('Avaliable.csv', header=0)

Orderbook['Operator'] = 'no'

def my_func(x):
    aaa = Operator.loc[Operator['Part number'] == x['Part Number'].values[0], 'Operator'].unique()
    bbb = Avaliable[(Avaliable['YYYYWW'] == x['Due Week'].values[0]) &
                    (Avaliable['Operator'].isin(aaa)) & (Avaliable['Hours'] > 0)]

    for i in bbb.index:
        ava = Avaliable.loc[i, 'Hours'] - x['Build Hours'].values
        if ava >= 0:
            Avaliable.loc[i, 'Hours'] = ava
            Orderbook.loc[x.index, 'Operator'] = Avaliable.loc[i, 'Operator']
            break# added loop interrupt

Orderbook.groupby(Orderbook.index).apply(my_func)

print(Orderbook)
print(Avaliable)

更新18.11.2022我没有周期。但是,你需要检查。如果你发现不正确的地方,请让我知道。你也可以通过在开始处输入以下内容来测量确切的处理时间:

import datetime

now = datetime.datetime.now()

最后打印经过的时间:

time_ = datetime.datetime.now() - now
print('elapsed time', time_)

代码:

Orderbook = pd.read_csv('Orderbook.csv', header=0)
Operator = pd.read_csv('Operator.csv', header=0)
Avaliable = pd.read_csv('Avaliable.csv', header=0)

Orderbook['Operator'] = 'no'

aaa = [Operator.loc[Operator['Part number'] == Orderbook.loc[i, 'Part Number'], 'Operator'].unique() for i in
       range(len(Orderbook))]

def my_func(x):
    bbb = Avaliable[(Avaliable['YYYYWW'] == x['Due Week'].values[0]) &
                    (Avaliable['Operator'].isin(aaa[x.index[0]])) & (Avaliable['Hours'] > 0)]

    fff = Avaliable.loc[bbb.index, 'Hours'] - x['Build Hours'].values
    ind = fff[fff.ge(0)].index
    Avaliable.loc[ind[0], 'Hours'] = fff[ind[0]]
    Orderbook.loc[x.index, 'Operator'] = Avaliable.loc[ind[0], 'Operator']

Orderbook.groupby(Orderbook.index).apply(my_func)

print(Orderbook)
print(Avaliable)

相关问题