如何用Pandas实现跨周滚动填充缺失月度数据?
实现滚动填充缺失月份数据的Pandas方案
Pandas没有专门的单一函数直接实现这个需求,但可以通过透视+向前填充+逆透视的组合操作高效完成,完全适配你描述的滚动补数场景,包括未来新增月份的情况。
核心思路
- 转宽表:以
周数为行索引,月份为列,数值字段为单元格值,把每个周的月份数据整理成一行。 - 向前填充(
ffill()):自动用最近一行(上一周)的非空值填充当前行的缺失列,正好对应“复制此前最近一周的对应月份数据”的需求。 - 转回长表:将宽表重新转为原始的行格式,得到每个周完整的月份记录。
代码示例
假设你的原始数据结构如下:
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
相关产品推荐
相关产品推荐

