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
相关产品推荐
相关产品推荐

