Pandas执行shift()操作后groupby聚合规则失效问题咨询
问题根因分析
- 原代码错误逻辑:
执行data.groupby(["store", "item", "period"]).sales.agg(["sum", "mean"])得到的是门店、商品、时段三级索引的聚合结果,此时直接调用shift(1)是对整张表的所有行做全局顺序移位,不会识别门店、商品的分组边界,自然会出现不同门店/商品的上期值错位匹配的问题。 - 调整后代码错误逻辑:
将period也纳入了groupby的分组键,每个分组对应「单个门店+单个商品+单个时段」的所有行,此时调用shift(1)是在同一个时段的同店同品数据内行维度移位,根本无法实现跨时段的历史值偏移;且groupby.shift()返回的是和原始输入数据行数一致的Series,保留原始数据的索引而非分组聚合后的多级索引,后续调用agg会全局聚合全量数据,完全脱离原有分组规则。
正确实现方案
要实现「每个门店+每个商品的上期聚合值匹配到当期」的需求,需要在聚合后,仅按门店、商品两个维度做分组移位,参考代码如下:
# 1. 先按门店、商品、时段分组,计算当期销售指标 period_sales_agg = data.groupby(["store", "item", "period"]).sales.agg(["sum", "mean"]) # 2. 按门店、商品分组,组内将聚合结果移位1位,得到上期的销售指标 last_period_sales_agg = period_sales_agg.groupby(["store", "item"]).shift(1)
若需要将上期指标关联回原始明细数据表,通过store、item、period三个字段做匹配拼接即可。
内容的提问来源于stack exchange,提问作者Shalva
相关产品推荐
相关产品推荐

