如何基于现有DataFrame为SKU新增各门店销售额列?
解决方法:将门店销售额转换为宽表列
核心思路
无需循环遍历SKU,直接利用pandas的透视表或分组转置功能,就能快速实现门店销售额的列转换,同时保留SKU的总销售额。
步骤1:原始数据示例
假设你的原始数据集DataFrame名为df,数据结构如下:
| SKU | Store code | sales |
|---|---|---|
| 1 | A432 | 123 |
| 2 | B123 | 456 |
| 1 | C234 | 98 |
步骤2:实现宽表转换
方法1:使用pivot_table
先按SKU和门店代码聚合销售额,再转成宽表,最后合并总销售额:
import pandas as pd # 按SKU和门店代码做透视,聚合销售额并填充空值为0 pivot_df = df.pivot_table(index='SKU', columns='Store code', values='sales', aggfunc='sum', fill_value=0) # 提取门店代码的前缀(A/B/C)作为新列名 pivot_df.columns = [col[0] for col in pivot_df.columns] # 计算每个SKU的总销售额 total_sales = df.groupby('SKU')['sales'].sum().rename('sales') # 合并总销售额和门店销售额列 result_df = pd.concat([total_sales, pivot_df], axis=1) # 补充缺失的A/B/C列(确保所有目标列都存在) for col in ['A', 'B', 'C']: if col not in result_df.columns: result_df[col] = 0 # 调整列顺序并重置索引 result_df = result_df[['sales', 'A', 'B', 'C']].reset_index()
方法2:使用groupby + unstack
更简洁的链式写法:
import pandas as pd result_df = ( df.assign(Store_prefix=df['Store code'].str[0]) .groupby(['SKU', 'Store_prefix'])['sales'].sum() .unstack(fill_value=0) .join(df.groupby('SKU')['sales'].sum().rename('sales')) .reindex(columns=['sales', 'A', 'B', 'C']) .reset_index() )
最终输出结构
基于原始数据,执行后得到的DataFrame如下:
| SKU | sales | A | B | C |
|---|---|---|---|---|
| 1 | 221 | 123 | 0 | 98 |
| 2 | 456 | 0 | 456 | 0 |
注:你期望输出中的数值为示例,实际结果会根据原始数据自动计算,核心逻辑是完成门店销售额的宽表转换。
内容的提问来源于stack exchange,提问作者tomas
相关产品推荐
相关产品推荐

