You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas:GroupBy调用.shift()后,如何用上一对应分组值填充缺失?

解决时间序列中上周同小时均值位移后的缺失值填充问题

问题分析

你当前的代码在计算区分工作日/周末的上周同小时均值时,因为分组包含year和week,导致shift()只能在同一年同一周的组内操作,跨年或新的一周会出现大量缺失。而直接按hour和是否周末分组ffill()会无限制填充历史值,不符合仅用前一周对应分组值填充的需求。

解决方案

核心思路是用连续的周序数替代year+week分组,确保跨年周是连续序列,然后针对每个小时+是否周末的组,仅取前一周的均值填充当前周的缺失。

步骤1:生成连续周序数与分组键

先从时间索引中提取关键分组字段,其中week_ord是连续的周序数(解决跨年周断档问题):

# 从索引提取小时、是否周末
df['hour'] = df.index.hour
df['is_weekend'] = df.index.dayofweek > 4
# 生成连续周序数(从0开始递增,跨年周也连续)
df['week_ord'] = df.index.to_period('W').ordinal

步骤2:计算每周分组均值

按小时+是否周末+连续周序数分组,计算每组的均值:

df['weekly_mean'] = df.groupby(['hour', 'is_weekend', 'week_ord'])['value'].transform('mean')

步骤3:位移并关联上周均值

提取每组每周的唯一均值,然后针对小时+是否周末组,将均值位移一周,最后合并回原数据:

# 提取每个(小时、是否周末、周)的唯一均值
weekly_summary = df.groupby(['hour', 'is_weekend', 'week_ord'])['weekly_mean'].first().reset_index()
# 对每个(小时、是否周末)组,将均值向后位移一周(当前周用上一周的均值)
weekly_summary['prev_week_value'] = weekly_summary.groupby(['hour', 'is_weekend'])['weekly_mean'].shift(1)
# 合并回原DataFrame,得到每个时间点对应的上周均值
df = df.merge(weekly_summary[['hour', 'is_weekend', 'week_ord', 'prev_week_value']],
              on=['hour', 'is_weekend', 'week_ord'], how='left')

效果说明

  • 新的prev_week_value字段,每个时间点的值都是上周同一小时、同一工作日/周末类型的均值
  • 仅当某组(小时+是否周末)没有前一周数据时才会缺失,不会出现用几个月前旧值填充的情况
  • 若需要处理最早几周的缺失值,可以针对性填充(比如用自身周的均值,或者最早的周均值),避免无限制向前填充

内容的提问来源于stack exchange,提问作者NotPzl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 05:50:11