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

Pandas按x、y分组新增往年feature对应值列的实现方法

需求说明

需要基于pandas DataFrame现有字段新增多列数据,新增列按x和y字段分组后按以下规则取值:

  • 列feature2:同分组下两年前对应的feature字段值
  • 列feature3:同分组下三年前对应的feature字段值
  • 列feature4:同分组下四年前对应的feature字段值
  • 规则需顺延支持最长回溯10年的历史值匹配

示例数据

数据集构造代码:

import pandas as pd

data = {'x': [40.1, 50.1, 40.1, 50.1, 40.1, 50.1, 40.1, 50.1, 40.1, 50.1 ], 
        'y': [100.1, 110.1, 100.1, 110.1, 100.1, 110.1, 100.1, 110.1, 100.1, 110.1], 
        'year': [2000, 2000, 2001, 2001, 2002, 2002, 2003, 2003, 2004, 2004], 
        'feature': [0, 1, 1, 1, 1, 0, 0, 0, 0, 1]}   
df = pd.DataFrame(data)

原始DataFrame样例:

x       y     year  feature
0   40.1    100.1   2000    0
1   50.1    110.1   2000    1
2   40.1    100.1   2001    1
3   50.1    110.1   2001    1
4   40.1    100.1   2002    1
5   50.1    110.1   2002    0
6   40.1    100.1   2003    0
7   50.1    110.1   2003    0
8   40.1    100.1   2004    0
9   50.1    110.1   2004    1

期望输出

x       y     year  feature   feature2  feature3   feature4
    0   40.1    100.1   2000    0         NaN       NaN        NaN
    1   50.1    110.1   2000    1         NaN       NaN        NaN
    2   40.1    100.1   2001    1         NaN       NaN        NaN
    3   50.1    110.1   2001    1         NaN       NaN        NaN
    4   40.1    100.1   2002    1          0        NaN        NaN
    5   50.1    110.1   2002    0          1        NaN        NaN
    6   40.1    100.1   2003    0          1         0         NaN
    7   50.1    110.1   2003    0          1         1         NaN
    8   40.1    100.1   2004    0          1         1          0
    9   50.1    110.1   2004    1          0         1          1
实现方案

根据数据特征可以选择两种实现方式,要支持最长10年回溯只需修改max_lookback参数为10即可自动生成所有回溯列。

方案1:通用字典映射(兼容年份断档场景)

该方法不要求年份连续,会严格按照年份差值匹配对应历史值,鲁棒性强,适合数据存在缺失年份的场景:

# 配置最长回溯年数,需要回溯10年就把值改为10
max_lookback = 4

# 预生成每个(x,y)分组下 年份到feature值 的映射字典
year_feature_map = df.groupby(['x', 'y']).apply(
    lambda group: dict(zip(group['year'], group['feature']))
).to_dict()

# 循环生成各年回溯列
for offset in range(2, max_lookback + 1):
    col_name = f"feature{offset}"
    df[col_name] = df.apply(
        lambda row: year_feature_map.get((row['x'], row['y']), {}).get(row['year'] - offset, pd.NA),
        axis=1
    )

方案2:分组移位(高性能,适合连续年份数据)

如果每个(x,y)分组内年份严格连续、每年仅1条记录,可使用该向量化方法,运行速度远高于apply,适合百万级以上大数据量场景:

# 配置最长回溯年数,需要回溯10年就把值改为10
max_lookback = 4

# 先按分组、年份升序排序,保证顺序正确
df = df.sort_values(by=['x', 'y', 'year']).reset_index(drop=True)

# 分组移位直接取对应偏移量的历史值
for offset in range(2, max_lookback + 1):
    col_name = f"feature{offset}"
    df[col_name] = df.groupby(['x', 'y'])['feature'].shift(offset)

运行以上任意一段代码,得到的结果都和期望输出完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:54:18