如何拆分销售交易表中的捆绑产品行至单个产品行
拆分捆绑SKU销售交易记录的解决方案
我来给你详细说说怎么处理这个需求,用Python的pandas库就能高效搞定,步骤清晰还不用写复杂循环:
先看原始数据
销售交易表
Date, Product, Qty 1 Jan 2017, A, 10 2 Jan 2017, Bundle X, 5 3 Jan 2017, B, 10 4 Jan 2017, Bundle Y, 5
捆绑产品组件关系表
ParentSKU, ComponentSKU, Quantity Bundle X, A, 3 Bundle X, B, 5 Bundle X, C, 10 Bundle Y, P, 5 Bundle Y, Q, 7 Bundle Y, R, 12 Bundle Y, S, 3
具体实现步骤
1. 导入库并加载数据
先把两张表的数据转换成pandas的DataFrame,方便后续操作:
import pandas as pd # 加载销售交易表数据 sales_data = [ ["1 Jan 2017", "A", 10], ["2 Jan 2017", "Bundle X", 5], ["3 Jan 2017", "B", 10], ["4 Jan 2017", "Bundle Y", 5] ] sales_df = pd.DataFrame(sales_data, columns=["Date", "Product", "Qty"]) # 加载捆绑组件关系表数据 bundle_data = [ ["Bundle X", "A", 3], ["Bundle X", "B", 5], ["Bundle X", "C", 10], ["Bundle Y", "P", 5], ["Bundle Y", "Q", 7], ["Bundle Y", "R", 12], ["Bundle Y", "S", 3] ] bundle_df = pd.DataFrame(bundle_data, columns=["ParentSKU", "ComponentSKU", "Quantity"])
2. 拆分单个SKU和捆绑SKU的记录
把销售表分成两部分:不需要处理的单个SKU记录,和需要拆分的捆绑SKU记录:
# 单个SKU的记录直接保留 single_sku_sales = sales_df[~sales_df["Product"].str.startswith("Bundle")].copy() # 筛选出需要拆分的捆绑SKU记录 bundle_sales = sales_df[sales_df["Product"].str.startswith("Bundle")].copy()
3. 关联组件表并计算实际销量
把捆绑销售记录和组件表关联,然后计算每个组件的实际销量(捆绑销售数量 × 单份捆绑里的组件数量):
# 按捆绑SKU关联两张表 merged_bundle = pd.merge( bundle_sales, bundle_df, left_on="Product", right_on="ParentSKU", how="inner" ) # 计算组件的实际销售数量 merged_bundle["Qty"] = merged_bundle["Qty"] * merged_bundle["Quantity"] # 整理成目标格式的列名和结构 split_bundle_sales = merged_bundle[["Date", "ComponentSKU", "Qty"]].rename(columns={"ComponentSKU": "Product"})
4. 合并结果得到最终表
把单个SKU的记录和拆分后的捆绑组件记录合并,再按日期排序就得到目标结果:
# 合并两部分数据 final_sales = pd.concat([single_sku_sales, split_bundle_sales], ignore_index=True) # 按日期排序,和示例结果顺序一致 final_sales = final_sales.sort_values("Date").reset_index(drop=True) # 输出结果 print(final_sales.to_csv(index=False))
运行后输出的结果完全符合你的要求:
Date,Product,Qty 1 Jan 2017,A,10 2 Jan 2017,A,15 2 Jan 2017,B,25 2 Jan 2017,C,50 3 Jan 2017,B,10 4 Jan 2017,P,25 4 Jan 2017,Q,35 4 Jan 2017,R,60 4 Jan 2017,S,15
补充:如果一定要用循环?
虽然用pandas的向量运算效率更高,但如果硬要写循环实现,也可以遍历每条捆绑销售记录,再遍历对应的组件生成新行,但代码会繁琐很多,数据量大的时候性能也差,所以更推荐上面的方法。
内容的提问来源于stack exchange,提问作者wannabecoder90
相关产品推荐
相关产品推荐

