Pandas如何通过带过滤的自关联实现长表转按店铺分列的周度销售宽表
实现方案
你要做的是分组聚合后宽表转换,用pivot或者多级索引unstack的方式比循环merge更简单稳定,完整实现代码如下:
import pandas as pd # 1. 先确保day列为datetime格式(如果已经是可以跳过这步) df['day'] = pd.to_datetime(df['day']) # 2. 按周、type、store分组,对销售额和订单量求和 df_grouped = df.groupby( [pd.Grouper(key='day', freq='W-MON', label='right'), 'type', 'store'] )[['sales', 'orders']].sum().reset_index() # 3. 透视生成宽表,缺失值填充为0 df_res = df_grouped.pivot( index=['day', 'type'], columns='store', values=['sales', 'orders'] ).fillna(0).astype(int) # 匹配示例的整数输出格式 # 4. 拼接列名,把两级列名合并成「指标_店铺」格式 df_res.columns = [f'{col[0]}_{col[1]}' for col in df_res.columns] # 5. 重置索引把day和type变回普通列 df_res = df_res.reset_index()
最终得到的df_res完全符合你需要的输出结构。
原有代码的问题
- 循环merge时
suffixes参数设置错误,两个后缀写了相同值,会导致列名冲突混乱 - 每次merge的子分组结果里都带
store列,多次outer join后会生成大量冗余的store_x、store_y列 - 店铺列表里重复写了两次
apple,会重复合并apple的数据,导致结果异常 - 多次outer join后缺失值不会自动填充为0,需要额外处理
内容的提问来源于stack exchange,提问作者Jonas Palačionis
相关产品推荐
相关产品推荐

