You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:05:02