如何用Pandas按分组填充缺失日期及前序有效值?
解决Pandas按组填充缺失日期并前向填充有效值的问题
没问题,这是处理时间序列数据时非常典型的需求,我来给你一个清晰的实现方案,附带详细解释:
步骤1:预处理日期列
首先要确保你的date列是Pandas能识别的datetime类型,否则无法正确生成连续日期序列:
import pandas as pd # 你的原始数据 dates=['2020-12-01','2020-12-04','2020-12-05', '2020-12-01','2020-12-04','2020-12-05'] symbols=['ABC','ABC','ABC','DEF','DEF','DEF'] v=[1,3,5,7,9,10] df= pd.DataFrame({'date':dates, 'g':symbols, 'v':v}) # 转换日期列类型 df['date'] = pd.to_datetime(df['date'])
步骤2:定义分组填充函数
我们需要为每个g分组单独生成连续的日期范围,并用**前向填充(ffill)**补全缺失的v值:
def process_group(group): # 生成当前分组的完整日期序列(从最早到最晚,按天频率) full_dates = pd.date_range(start=group['date'].min(), end=group['date'].max(), freq='D') # 将分组数据的索引设为date,重新索引到完整日期序列,用前值填充缺失 group_filled = group.set_index('date').reindex(full_dates).ffill() # 重置索引,把date变回普通列 group_filled = group_filled.reset_index().rename(columns={'index': 'date'}) return group_filled
步骤3:应用分组处理
用groupby.apply将函数应用到每个分组,最后整理索引:
result_df = df.groupby('g').apply(process_group).reset_index(drop=True)
验证结果
打印result_df就能看到你想要的效果:
date g v 0 2020-12-01 ABC 1.0 1 2020-12-02 ABC 1.0 2 2020-12-03 ABC 1.0 3 2020-12-04 ABC 3.0 4 2020-12-05 ABC 5.0 5 2020-12-01 DEF 7.0 6 2020-12-02 DEF 7.0 7 2020-12-03 DEF 7.0 8 2020-12-04 DEF 9.0 9 2020-12-05 DEF 10.0
补充说明
ffill()会用最近的非缺失值填充,正好符合你“前序有效值”的需求;- 如果需要后向填充可以用
bfill(),不过这里显然前向更合适; freq='D'表示按天生成序列,你可以根据需求改成小时('H')、周('W')等其他频率。
内容的提问来源于stack exchange,提问作者Stack Overflow
相关产品推荐
相关产品推荐

