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

如何用Pandas实现跨周滚动填充缺失月度数据?

实现滚动填充缺失月份数据的Pandas方案

Pandas没有专门的单一函数直接实现这个需求,但可以通过透视+向前填充+逆透视的组合操作高效完成,完全适配你描述的滚动补数场景,包括未来新增月份的情况。

核心思路

  1. 转宽表:以周数为行索引,月份为列,数值字段为单元格值,把每个周的月份数据整理成一行。
  2. 向前填充(ffill()):自动用最近一行(上一周)的非空值填充当前行的缺失列,正好对应“复制此前最近一周的对应月份数据”的需求。
  3. 转回长表:将宽表重新转为原始的行格式,得到每个周完整的月份记录。

代码示例

假设你的原始数据结构如下:

import pandas as pd

# 构造测试数据
data = [
    {"周数": 1, "月份": "1月", "分类": "A", "数值": 100},
    {"周数": 1, "月份": "2月", "分类": "A", "数值": 200},
    {"周数": 2, "月份": "2月", "分类": "A", "数值": 210},
    {"周数": 2, "月份": "3月", "分类": "A", "数值": 300},
    {"周数": 3, "月份": "3月", "分类": "A", "数值": 310},
    {"周数": 3, "月份": "4月", "分类": "A", "数值": 400},
]
df = pd.DataFrame(data)

按分类分组处理(适配多分类场景)

如果存在分类列,需要按分类分组后独立处理每个分类的滚动填充:

# 按分类分组,对每个组执行透视+填充+逆透视操作
filled_df = (
    df.groupby("分类", group_keys=False)
    .apply(
        lambda g: g.pivot(index="周数", columns="月份", values="数值")
                   .ffill()  # 向前填充缺失的月份数据
                   .reset_index()
                   .melt(id_vars=["周数"], var_name="月份", value_name="数值", ignore_index=False)
                   .dropna()
                   .reset_index(drop=True)
    )
)

# 查看结果
print(filled_df)

执行后,第2周会补上1月的数据(来自第1周的1月值),第3周会补上1月、2月的数据(分别来自第1周1月、第2周2月的值),完全符合需求。

关键点说明

  • ffill()会自动处理未来新增的月份:当后续周出现新月份时,前面的周不会被影响,新周缺失的旧月份会自动用最近一周的对应值填充。
  • 如果不需要按分类处理,直接去掉groupby部分即可。
  • 填充后的数据会保留每个周的所有历史月份记录,形成连续完整的时序数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:52:41