如何在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
原始数据集
| Group | Year | Value |
|---|---|---|
| A | 1990 | NaN |
| A | 1992 | 1 |
| A | 1995 | NaN |
| A | 1997 | NaN |
| A | 1998 | NaN |
| A | 2001 | NaN |
| A | 2002 | 1 |
| B | 1991 | 1 |
| B | 1992 | NaN |
| B | 1995 | NaN |
| B | 1998 | NaN |
| B | 2001 | 1 |
| B | 2002 | NaN |
期望结果
| Group | Year | Value |
|---|---|---|
| A | 1990 | NaN |
| A | 1992 | 1 |
| A | 1995 | 1 |
| A | 1997 | 1 |
| A | 1998 | NaN |
| A | 2001 | NaN |
| A | 2002 | 1 |
| B | 1991 | 1 |
| B | 1992 | 1 |
| B | 1995 | 1 |
| B | 1998 | NaN |
| B | 2001 | 1 |
| B | 2002 | 1 |
解决方案(Pandas实现)
核心思路:
- 按
Group分组,向前传播非缺失值的Value和对应的Year - 计算当前行
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
相关产品推荐
相关产品推荐

