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

如何在Python中按Group分组并基于Year列条件进行向前填充

问题描述

按Group分组对Value列进行向前填充,仅对与最近非缺失值对应的Year间隔不超过5年的缺失值填充。

示例规则

以Group A为例:

  • 1992年Value为1,1995-1992=3 ≤5,故1995年Value填充为1
  • 1997-1992=5 ≤5,故1997年Value填充为1
  • 1998-1992=6 >5,故1998年Value保持NaN

原始数据集

GroupYearValue
A1990NaN
A19921
A1995NaN
A1997NaN
A1998NaN
A2001NaN
A20021
B19911
B1992NaN
B1995NaN
B1998NaN
B20011
B2002NaN

期望结果

GroupYearValue
A1990NaN
A19921
A19951
A19971
A1998NaN
A2001NaN
A20021
B19911
B19921
B19951
B1998NaN
B20011
B20021

解决方案(Pandas实现)

核心思路:

  1. 按Group分组,向前传播非缺失值的Value和对应的Year
  2. 计算当前行Year与传播来的Year的差值,仅保留差值≤5的填充值,否则恢复为NaN

代码实现:

import pandas as pd

# 构建原始数据
df = pd.DataFrame({
    'Group': ['A']*7 + ['B']*6,
    'Year': [1990,1992,1995,1997,1998,2001,2002,1991,1992,1995,1998,2001,2002],
    'Value': [float('nan'),1,float('nan'),float('nan'),float('nan'),float('nan'),1,1,float('nan'),float('nan'),float('nan'),1,float('nan')]
})

# 分组处理函数
def fill_with_year_limit(group):
    # 向前填充非缺失值的Value和对应的Year
    filled_value = group['Value'].ffill()
    filled_year = group['Year'].where(group['Value'].notna()).ffill()
    # 筛选年份差≤5的行,其余恢复为NaN
    mask = (group['Year'] - filled_year) <= 5
    return filled_value.where(mask, float('nan'))

# 应用分组处理
df['Value'] = df.groupby('Group').apply(fill_with_year_limit).reset_index(drop=True)

print(df)

代码说明:

  • group['Year'].where(group['Value'].notna()).ffill():仅保留非缺失值对应的年份,再向前传播,让每行都能获取最近的有效年份
  • 通过年份差判断是否保留填充值,精准控制填充范围

内容的提问来源于stack exchange,提问作者leilei

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:56:10