Python Pandas求每周零售商-SKU销售额占当周总额比例问题
计算每周各零售商-SKU销售额的周占比
你好,针对你要计算每周各零售商-SKU销售额占当周总销售额比例的需求,我给你两种贴合现有数据的简洁实现方案:
方案1:用groupby.transform一步到位(推荐)
transform方法能在不改变原数据结构的前提下,把每周的总销售额直接映射到对应的每一行,非常适合你的场景:
# 保留你已经完成的分组求和 df_group = df_period.groupby(['Sku', 'Week','RetailerCode'], as_index=False)['Sales'].sum() # 新增列:计算当前行所属周的总销售额,广播到每一行 df_group['Week_Total_Sales'] = df_group.groupby('Week')['Sales'].transform('sum') # 计算占比,同时处理周总销售额为0的情况(避免除以0报错) df_group['Sales_Ratio'] = df_group['Sales'] / df_group['Week_Total_Sales'].replace(0, float('nan'))
处理后,Sales_Ratio列就是你要的占比——比如你示例里第49周的总销售额是1336,RC1003的占比就是832/1336≈0.6228,完全符合预期。
方案2:分步计算周总销售额再合并
如果你更习惯分步操作,也可以先单独算出每周的总销售额,再和现有数据关联:
# 第一步:保留你已有的分组数据 df_group = df_period.groupby(['Sku', 'Week','RetailerCode'], as_index=False)['Sales'].sum() # 第二步:单独计算每周的总销售额,并重命名列避免冲突 weekly_total = df_period.groupby('Week', as_index=False)['Sales'].sum().rename(columns={'Sales': 'Week_Total_Sales'}) # 第三步:按Week字段合并两个数据框 df_group = df_group.merge(weekly_total, on='Week', how='left') # 第四步:计算占比,同样处理分母为0的情况 df_group['Sales_Ratio'] = df_group['Sales'] / df_group['Week_Total_Sales'].replace(0, float('nan'))
小提示
- 两种方案的核心都是先拿到每周的总销售额,再和原数据关联计算比例——不需要同时按Week和Retailer分组,因为我们需要的是整周的总和,不是某零售商的周总和。
- 替换0为
nan是为了避免当某周总销售额为0时出现除以0的报错,这时候占比设为空值更合理。
内容的提问来源于stack exchange,提问作者user6083088
相关产品推荐
相关产品推荐

