Python中为缺失月份补行 按分区用最后值填充NULL
按ID补全缺失月份并填充最后有效值
问题描述
给定包含id、month、value列的DataFrame,需要:
- 为每个
id补全从其最早出现的月份到2023年4月的所有缺失月份行 - 用该
id的最后一个有效值向后填充value列的NULL值;若id的初始value即为NULL,则后续月份保持NULL
输入示例
import pandas as pd import numpy as np # 构造输入数据 df = pd.DataFrame({ 'id': [1,1,2,3,4], 'month': ['2023-01-01', '2023-02-01', '2023-01-01', '2023-02-01', '2023-03-01'], 'value': ['London', 'Paris', 'New York', 'Paris', np.nan] }) # 转换日期类型 df['month'] = pd.to_datetime(df['month'])
解决方案代码
# 定义目标结束月份 end_month = pd.to_datetime('2023-04-01') # 按id分组处理 result = df.groupby('id').apply(lambda x: # 生成当前id的完整日期序列:从最早月份到end_month,按月 x.set_index('month').reindex(pd.date_range(start=x['month'].min(), end=end_month, freq='MS')) # 重置索引,恢复month列 .reset_index() # 向前填充value列的缺失值 .ffill() # 保留id列(分组后id会变成索引,这里重置后需要重新赋值) .assign(id=x.name) )[['id', 'month', 'value']] # 重置结果的索引 result = result.reset_index(drop=True) # 查看输出 print(result)
代码解释
- 日期类型转换:先将
month列转为datetime类型,方便后续生成日期序列 - 分组处理:按
id分组,对每个分组单独处理 - 生成完整日期序列:用
pd.date_range生成从该id最早月份到2023-04-01的所有月初日期(freq='MS'表示每月第一天) - 重新索引补全行:通过
reindex补全缺失的月份行,此时缺失的value会变为NaN - 向前填充:用
ffill()方法填充value列,会自动延续最后一个有效值;如果分组的初始value就是NaN(如id=4),则填充后仍保持NaN - 整理输出结构:重置索引并调整列顺序,确保输出格式与期望一致
输出结果
id month value 0 1 2023-01-01 London 1 1 2023-02-01 Paris 2 1 2023-03-01 Paris 3 1 2023-04-01 Paris 4 2 2023-01-01 New York 5 2 2023-02-01 New York 6 2 2023-03-01 New York 7 2 2023-04-01 New York 8 3 2023-02-01 Paris 9 3 2023-03-01 Paris 10 3 2023-04-01 Paris 11 4 2023-03-01 NaN 12 4 2023-04-01 NaN
内容的提问来源于stack exchange,提问作者Jresearcher
相关产品推荐
相关产品推荐

