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

如何基于前组首次出现为DataFrame创建前后版本关联列?

实现方案

核心思路

要实现需求,关键是按reg分组处理每个注册项内的版本关系,利用groupby+shift快速获取每个版本的前后版本首个ID,再映射回原DataFrame。这种方法无需手动构建字典或循环,效率高且适配任意数量的版本。

步骤代码

  1. 构建示例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)
  1. 提取每个(reg, version)的首个ID
    先按reg和version分组,取出每组的第一个id,保留分组键用于后续关联:
version_first = df.groupby(['reg', 'version'])['id'].first().reset_index(name='first_id')
  1. 计算前后版本的首个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)
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 10:25:22