为DataFrame补全缺失年份行并向前填充变量值
高效实现按ID补全年份并向前填充变量
原始数据构造
首先还原你提供的初始DataFrame:
import pandas as pd df = pd.DataFrame({ 'ID': [1,1,1,2,2,2], 'Year': [1990,1995,1999,2000,2001,2010], 'Variable': [1,10,12,3,4,12] })
核心高效方案
针对大数据量,必须避免Python层面的循环,优先使用Pandas内置的向量化分组操作,以下两种方法均为性能最优选择:
方法1:groupby + resample(时间序列优化型)
利用resample对每个ID的年份序列进行重采样,自动补全缺失年份,再通过ffill向前填充变量:
# 将Year转为datetime类型以适配resample df['Year'] = pd.to_datetime(df['Year'], format='%Y') # 按ID分组,按年重采样并向前填充 result = df.set_index('Year').groupby('ID').resample('Y').ffill().reset_index() # 将Year转回整数格式(按需选择) result['Year'] = result['Year'].dt.year
优势:resample是Pandas针对时间序列优化的底层C实现操作,处理百万级数据速度极快。
方法2:groupby + reindex(整数年份直处理型)
若无需转换时间格式,可手动生成每个ID的完整年份范围,再用reindex补全:
def fill_year_group(group): # 生成当前ID的完整年份序列 year_range = pd.RangeIndex(group['Year'].min(), group['Year'].max() + 1) # 重索引并向前填充 return group.set_index('Year').reindex(year_range).ffill().reset_index() # 按ID分组应用函数 result = df.groupby('ID', group_keys=False).apply(fill_year_group)
优势:无需时间格式转换,逻辑直观,性能与方法1接近,适合纯整数年份场景。
输出结果验证
两种方法均会生成你要求的目标DataFrame:
ID Year Variable 0 1 1990 1 1 1 1991 1 2 1 1992 1 3 1 1993 1 4 1 1994 1 5 1 1995 10 6 1 1996 10 7 1 1997 10 8 1 1998 10 9 1 1999 12 10 2 2000 3 11 2 2001 4 12 2 2002 4 ...
性能说明
- 两种方法均基于Pandas的C扩展层执行,完全规避Python循环,处理千万级以内数据无压力。
- 若数据量突破千万级,可结合
Dask进行并行扩展,但常规业务场景下上述方案已足够高效。
内容的提问来源于stack exchange,提问作者BKS
相关产品推荐
相关产品推荐

