You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中按门店与尺码累计扣减库存订单数量?

实现Pandas中按分组累计扣减库存的需求

问题背景

现有两个Pandas DataFrame:df_1存储订单数据,df_2存储各门店的库存数据。当前已通过门店位置和尺码左连接两个DataFrame,并实现了用初始库存直接扣除对应订单数量,但需要改为按门店位置+尺码分组,持续累计扣减——即前一个订单扣减后的库存作为下一个订单的初始库存。

原始数据

订单数据(df_1)

import pandas as pd

df_1 = pd.DataFrame(
    columns=['size', 'ordered_by', 'shop_location', 'order_quantity'],
    data=[['L', 'Tom', 'London', 1], 
          ['M', 'Alice', 'Manchester', 1],
          ['S', 'Alice', 'Manchester', 1],
          ['S', 'Georgia', 'Newcastle', 1], 
          ['L', 'Bart', 'Manchester', 3], 
          ['M', 'Bob', 'Manchester', 1], 
          ['L', 'Toby', 'London', 2]]
)

库存数据(df_2)

df_2 = pd.DataFrame(
    columns=['size', 'shop_location', 'stock', 'price'],
    data=[['S', 'London', '5', '7.99'],
          ['M', 'London', '9', '7.99'],
          ['L', 'London', '3', '8.99'],
          ['XL', 'London', '7', '8.99'],
          ['S', 'Manchester', '2', '7.99'],
          ['M', 'Manchester', '2', '7.99'],
          ['L', 'Manchester', '15', '8.99'],
          ['XL', 'Manchester', '8', '8.99'],
          ['S', 'Newcastle', '2', '7.99'],
          ['M', 'Newcastle', '11', '7.99'],
          ['L', 'Newcastle', '4', '8.99'],
          ['XL', 'Newcastle', '1', '8.99']]
)

当前实现及问题

当前左连接后直接用初始库存减订单量的代码:

df_merge = pd.merge(
    df_1,
    df_2,
    how='left',
    left_on=['shop_location', 'size'],
    right_on=['shop_location','size']
)

df_merge['stock'] = df_merge['stock'].astype(int) - df_merge['order_quantity'].astype(int)

此方法的问题是:同一门店同一尺码的所有订单都用初始库存扣减,而非累计扣减(如曼彻斯特M码的第二个订单库存未在前一个扣减后的基础上继续减少)。

解决方案

核心思路:按门店位置+尺码分组,计算每组内的累计订单量,用该组的初始库存减去累计订单量,得到实时库存。

实现代码

# 合并数据并转换数据类型
df_merge = pd.merge(
    df_1,
    df_2,
    how='left',
    left_on=['shop_location', 'size'],
    right_on=['shop_location','size']
)
df_merge['stock'] = df_merge['stock'].astype(int)
df_merge['order_quantity'] = df_merge['order_quantity'].astype(int)
df_merge['price'] = df_merge['price'].astype(float)

# 按门店+尺码分组,计算累计订单量
df_merge['cumulative_orders'] = df_merge.groupby(['shop_location', 'size'])['order_quantity'].cumsum()

# 计算实时库存:初始库存 - 累计订单量
df_merge['stock'] = df_merge.groupby(['shop_location', 'size'])['stock'].transform('first') - df_merge['cumulative_orders']

# 可选:删除辅助列
df_merge = df_merge.drop('cumulative_orders', axis=1)

print(df_merge)

运行结果

size ordered_by shop_location  order_quantity  stock  price
0    L        Tom        London               1      2   8.99
1    M      Alice    Manchester               1      1   7.99
2    S      Alice    Manchester               1      1   7.99
3    S    Georgia     Newcastle               1      1   7.99
4    L       Bart    Manchester               3     12   8.99
5    M        Bob    Manchester               1      0   7.99
6    L       Toby        London               2      0   8.99

可以看到,曼彻斯特门店的M码第二个订单库存已变为0,符合累计扣减的需求。


内容的提问来源于stack exchange,提问作者holger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 12:02:08