首页 > 解决方案 > 使用两个 Pandas DataFrame 将库存分配给订单

问题描述

我有两个熊猫数据框,一个包含 stock: supply,另一个包含未结订单列表:orders

供应:

库存单位 供应_数量 已分配 错过
产品A 5 0 0
产品B 5 0 0
产品C 5 0 0

订单:

order_id 线 库存单位 需要_数量 供应_批准
1 1 产品A 5
2 1 产品D 5
3 1 产品C 5
3 2 产品A 5
4 1 产品C 5

该代码当前循环遍历订单并检查覆盖每种材料所需的数量。然后,供应数据框显示供应可以支持多少单位的库存,以及使用分配错过的供应列不能支持的数量。

我想通过循环遍历订单数据框来改进这一点,检查该行是否有足够的库存,是否将“已批准”添加到Supply_Approved 列?并从供应 DataFrames 中删除该数量,否则将值设置为“未批准”。

附加信息:我知道不建议循环遍历 DataFrames,但是我看不到另一种解决方法。

一旦我弄清楚这部分,我计划增加更多复杂性,例如如果订单上的所有行都可以支持,则仅标记“已批准”。

import pandas as pd

import random

def get_supply():

    supply = pd.DataFrame([{'sku': 'ProductA', 'Supply_QTY': 5},
         {'sku': 'ProductB', 'Supply_QTY': 5},
         {'sku': 'ProductC', 'Supply_QTY': 5},
         {'sku': 'ProductD', 'Supply_QTY': 5},
         ], columns=['sku', 'Supply_QTY']).set_index('sku')
    
    supply.loc[:, 'allocated'] = 0
    supply.loc[:, 'missed'] = 0
    return supply

def get_orders():
    skus = ['ProductA', 'ProductB', 'ProductC', 'ProductD']
    res = []
    for i in range(0, 1000, 1):
        res.append({'order_id': i, 
                    'sku': random.choice(skus),
                    'line': 1,
                    'Needed_QTY': 1})    

    orders = pd.DataFrame(res, 
         columns=['order_id', 'sku','line', 'Needed_QTY']).set_index('order_id')
    return orders

supply = get_supply()
orders = get_orders()

for i, res in orders.iterrows():

    sku = res['sku']
    n_items = res['Needed_QTY']

    inv = supply[supply.index == sku]['Supply_QTY'].values[0]
    
    if (inv-n_items) >= 0:
        supply.loc[(supply.index == sku), 'allocated'] += n_items
        supply.loc[(supply.index == sku), 'Supply_QTY'] -= n_items
    else:
        supply.loc[(supply.index == sku), 'missed'] += n_items
    
    

标签: pythonpandasdataframe

解决方案


推荐阅读