使用Pandas补全DataFrame中各SKU全年12个月份的对应记录
Pandas DataFrame月份扩展补全实现方案
需求说明
针对SKU_ID、供应商、年份、UOM的唯一组合,补全每年1-12月的所有行,无原始数据的月份VOLUME和COST字段自动留空,支持多SKU批量处理。
实现代码
import pandas as pd # -------------- 1. 构造样例输入数据(实际使用时替换为你的数据源读取代码即可) -------------- raw_data = [ ["SKU_123a", "Supplier_8", 2020, 2, "Case", 12, "$101.36"], ["SKU_123a", "Supplier_8", 2020, 3, "Case", 72, "$101.36"], ["SKU_123a", "Supplier_8", 2020, 6, "Case", 36, "$101.36"], ["SKU_123a", "Supplier_8", 2020, 7, "Case", 36, "$101.36"], ["SKU_123a", "Supplier_8", 2020, 9, "Case", 36, "$101.36"], ["SKU_123a", "Supplier_8", 2020, 10, "Case", 72, "$101.36"], ["SKU_456b", "Supplier_21", 2020, 4, "Case", 32, "$10.36"], ["SKU_456b", "Supplier_21", 2020, 5, "Case", 2, "$10.36"] ] df = pd.DataFrame(raw_data, columns=["SKU_ID", "SUPPLIER", "YEAR", "MONTH", "UOM", "VOLUME", "COST"]) # -------------- 2. 生成全量月份骨架 -------------- # 定义分组维度列 dim_cols = ["SKU_ID", "SUPPLIER", "YEAR", "UOM"] # 提取所有不重复的维度组合 unique_dims = df[dim_cols].drop_duplicates() # 生成1-12月序列 month_range = pd.DataFrame({"MONTH": range(1, 13)}) # 笛卡尔积生成每个维度组合的全年12月骨架 full_skeleton = unique_dims.merge(month_range, how="cross") # -------------- 3. 关联原始数据补全数值 -------------- result = full_skeleton.merge(df, on=dim_cols + ["MONTH"], how="left") # 按业务维度和月份排序 result = result.sort_values(by=dim_cols + ["MONTH"]).reset_index(drop=True) # 若需要将空值替换为空白字符串,可取消注释下行代码 # result = result.fillna('') # 输出结果 print(result)
代码说明
- 自动适配多SKU、多供应商、多年份场景:无需手动指定维度值,代码会自动识别所有存在的唯一维度组合生成对应月份行
- 空值处理:无原始数据的月份VOLUME和COST字段默认填充NaN,可根据需要调整为空字符串
- 性能优化:10万级以下维度组合运行效率无压力,超大批量场景可提前过滤无效年份减少计算量
内容的提问来源于stack exchange,提问作者spartanboy
相关产品推荐
相关产品推荐

