如何基于前组首次出现为DataFrame创建前后版本关联列?
实现方案
核心思路
要实现需求,关键是按reg分组处理每个注册项内的版本关系,利用groupby+shift快速获取每个版本的前后版本首个ID,再映射回原DataFrame。这种方法无需手动构建字典或循环,效率高且适配任意数量的版本。
步骤代码
- 构建示例DataFrame
import pandas as pd data = { 'id': [1,2,3,4,5,6,7], 'reg': [54,54,54,54,54,54,55], 'version': [1,1,1,2,3,3,1] } df = pd.DataFrame(data)
- 提取每个(reg, version)的首个ID
先按reg和version分组,取出每组的第一个id,保留分组键用于后续关联:
version_first = df.groupby(['reg', 'version'])['id'].first().reset_index(name='first_id')
- 计算前后版本的首个ID
按reg分组后,用shift(1)获取上一个版本的首个ID(即previous_version),shift(-1)获取下一个版本的首个ID(即next_version),无对应版本时自动填充NaN(对应需求中的NULL):
# 先按reg和version排序,确保版本顺序正确(如果原数据版本乱序的话) version_first = version_first.sort_values(['reg', 'version']) version_first['previous_version'] = version_first.groupby('reg')['first_id'].shift(1) version_first['next_version'] = version_first.groupby('reg')['first_id'].shift(-1)
- 关联回原DataFrame
通过reg和version作为关联键,将计算好的前后版本ID合并到原表中:
result = df.merge( version_first[['reg', 'version', 'previous_version', 'next_version']], on=['reg', 'version'], how='left' )
最终结果
执行后得到的result即为需求中的目标DataFrame:
id reg version previous_version next_version 0 1 54 1 NaN 4.0 1 2 54 1 NaN 4.0 2 3 54 1 NaN 4.0 3 4 54 2 1.0 5.0 4 5 54 3 4.0 NaN 5 6 54 3 4.0 NaN 6 7 55 1 NaN NaN
(注:NaN可通过result.fillna('NULL')转为字符串形式的NULL,根据需求调整即可)
优势说明
- 适配任意数量的版本:只要
reg分组内的版本有序,无论多少个版本都能自动计算前后关系 - 高效简洁:利用pandas内置的分组和移位函数,避免手动遍历,处理大数据量时性能更优
- 逻辑清晰:每一步操作都对应明确的业务逻辑,易于维护和修改
内容的提问来源于stack exchange,提问作者NAB0815
相关产品推荐
相关产品推荐

