Pandas:按ProdID补全缺失日期并向前填充数值字段
解决方法:用Pandas分组补全日期并前向填充
这个需求在时间序列数据处理里太常见了,我来一步步给你拆解实现步骤,保证你能直接复用:
1. 准备数据并格式化日期
首先得把日期列转成datetime类型,不然没法正确生成连续的日期序列:
import pandas as pd # 构造你提供的示例数据 data = { 'ProdID': ['Prod1', 'Prod1', 'Prod1', 'Prod2', 'Prod2', 'Prod2', 'Prod2'], 'Date': ['4/1/2019', '4/3/2019', '4/4/2019', '4/1/2019', '4/2/2019', '4/3/2019', '4/4/2019'], 'Val1': [1, 2, 3, 1, 1, 2, 2], 'Val2': [3, 3, 4, 3, 3, 4, 5], 'Val3': [4, 54, 54, 3, 4, 4, 3] } df = pd.DataFrame(data) # 把Date列转为datetime类型,确保日期能被正确识别 df['Date'] = pd.to_datetime(df['Date'], format='%m/%d/%Y')
2. 分组补全日期+前向填充缺失值
核心逻辑是按ProdID分组,给每个分组生成完整的日期序列,再用前一条有效数据填充缺失的Val字段:
def fill_missing_dates(group): # 生成当前ProdID的完整日期范围(从组内最早到最晚日期) full_dates = pd.date_range(start=group['Date'].min(), end=group['Date'].max(), freq='D') # 把原数据按日期索引重新对齐,缺失的日期会自动生成NaN行 group = group.set_index('Date').reindex(full_dates) # 恢复ProdID列(reindex后该列会变成NaN,用分组名称填充) group['ProdID'] = group.name # 用前向填充(ffill)补全Val1-Val3的缺失值——就是拿上一条有效数据填当前空值 group = group.ffill() # 把日期从索引放回列里,重置索引 return group.reset_index().rename(columns={'index': 'Date'}) # 按ProdID分组应用函数,再合并所有分组的结果 filled_df = df.groupby('ProdID').apply(fill_missing_dates).reset_index(drop=True)
3. 查看最终结果
运行后打印filled_df就能得到你要的目标表格:
print(filled_df)
输出示例:
Date ProdID Val1 Val2 Val3 0 2019-04-01 Prod1 1.0 3.0 4.0 1 2019-04-02 Prod1 1.0 3.0 4.0 # 这行是补全的缺失日期,用4/1的数据填充 2 2019-04-03 Prod1 2.0 3.0 54.0 3 2019-04-04 Prod1 3.0 4.0 54.0 4 2019-04-01 Prod2 1.0 3.0 3.0 5 2019-04-02 Prod2 1.0 3.0 4.0 6 2019-04-03 Prod2 2.0 4.0 4.0 7 2019-04-04 Prod2 2.0 5.0 3.0
补充小技巧
- 如果所有ProdID都需要固定日期范围(比如不管组内数据,都要覆盖4/1到4/4),直接把
full_dates改成固定起止:pd.date_range(start='2019-04-01', end='2019-04-04', freq='D') - 要是需要把Val字段转回整数类型,加一行:
filled_df[['Val1','Val2','Val3']] = filled_df[['Val1','Val2','Val3']].astype(int)
内容的提问来源于stack exchange,提问作者MarekK
相关产品推荐
相关产品推荐

