Pandas按id分组补全季度日期并后向填充缺失数值的实现方法
实现方案
你可以直接用pandas原生的索引重对齐+分组填充的逻辑实现,代码简洁且性能优异,适配多列批量填充的场景:
完整可运行代码
import pandas as pd from numpy import nan # 构造示例数据 d = {'id': ['a', 'a', 'a', 'b', 'b'], 'date': ['2020-09-30', '2020-06-30', '2020-03-31', '2020-09-30', '2020-06-30'], 'amount': [1, 2, nan , 5, nan]} df = pd.DataFrame(data=d) df['date'] = pd.to_datetime(df['date']) # 1. 配置参数:指定季度起始日期 start_quarter_date = '2019-12-31' # 2. 生成完整的季度末日期序列:从起始日期到现有数据最大日期 full_quarter_dates = pd.date_range(start=start_quarter_date, end=df['date'].max(), freq='Q-DEC') # 3. 生成所有id和日期的全组合,补全缺失行 full_df = df.set_index(['id', 'date']).reindex( pd.MultiIndex.from_product([df['id'].unique(), full_quarter_dates], names=['id', 'date']) ).reset_index() # 4. 按id分组,每组按日期倒序排列后前向填充,即用最近的后续已知值填充更早的缺失值 full_df = full_df.sort_values(['id', 'date'], ascending=[True, False])\ .groupby('id', group_keys=False)\ .apply(lambda x: x.ffill()) # 可选:调整排序和示例输出完全一致 full_df = full_df.sort_values(['id', 'date'], ascending=[True, False]).reset_index(drop=True) print(full_df)
逻辑说明
- 用
pd.date_range生成符合要求的完整季度序列,自动对齐季度末日期,不用手动处理日期格式 - 通过
MultiIndex.from_product直接生成所有id对应的全量日期组合,一行代码完成缺失行补全 - 分组后按日期倒序+前向填充,刚好实现「用时间更近的已有值填充更早的缺失值」的需求,所有数值/非数值列都可以自动批量填充,不用单独处理附加列
内容的提问来源于stack exchange,提问作者Mustard Tiger
相关产品推荐
相关产品推荐

