如何用Pandas将门店周销售长表按店品组合转换为多周销量宽表
Pandas 原生实现周度销售数据宽表转换
核心采用pivot_table算子实现,逻辑和PySpark的pivot算子完全对齐,后续迁移Spark成本极低,性能远高于纯Python字典实现。
核心实现代码
import pandas as pd # 原始长表DataFrame命名为df_sales wide_df = df_sales.pivot_table( index=["store_id", "item_id"], columns="week", values="sales", fill_value=0, # 无重复(store,item,week)记录时可替换为"first"提升运行速度 aggfunc="sum" ).reset_index() # 按要求重命名列名 wide_df.columns = [ col if col in ("store_id", "item_id") else f"sales_week_{col}" for col in wide_df.columns ]
方案优势
- 全Pandas原生API实现,无自定义循环逻辑,百万级数据处理速度比纯Python字典实现快10倍以上
- 内置
fill_value参数直接完成缺失记录补0,无需额外调用fillna - 聚合逻辑和Spark的
groupBy("store_id","item_id").pivot("week").sum("sales")完全对齐,后续迁移到PySpark仅需调整语法,核心逻辑无需重构
可选优化
如果周度维度数量过多,可提前筛选需要的周次再做转换,降低内存占用:
# 示例:仅保留2024年第1-12周的数据做转换 valid_weeks = list(range(202401, 202413)) filtered_sales = df_sales[df_sales["week"].isin(valid_weeks)] # 后续对filtered_sales执行pivot操作即可
效果示例
原始长表样例
| store_id | item_id | week | sales |
|---|---|---|---|
| 1 | 101 | 1 | 20 |
| 1 | 101 | 2 | 15 |
| 1 | 102 | 1 | 30 |
| 2 | 101 | 2 | 25 |
转换后宽表样例
| store_id | item_id | sales_week_1 | sales_week_2 |
|---|---|---|---|
| 1 | 101 | 20 | 15 |
| 1 | 102 | 30 | 0 |
| 2 | 101 | 0 | 25 |
内容的提问来源于stack exchange,提问作者Manish Tripathi
相关产品推荐
相关产品推荐

