基于提交日期排序并标记版本升级类型的Pandas实现问题
解决方案
核心思路
- 将字符串类型的版本号转换为可结构化比较的对象,兼容
1.0(两位)、1.0.1(三位)等格式; - 按
id分组后以commitDate排序,确保版本记录按时间顺序排列; - 逐组对比相邻版本的
major/minor/patch字段,按规则生成标记标签。
步骤代码
1. 安装依赖(若未安装)
pip install packaging
2. 完整处理代码
import pandas as pd from packaging.version import Version # 假设你的DataFrame名为df,包含commitDate、info_version、id字段 # 1. 将字符串版本号转换为可比较的Version对象 df['version_obj'] = df['info_version'].apply(Version) # 2. 按id分组,再按commitDate升序排序(确保时间顺序) df_sorted = df.sort_values(by=['id', 'commitDate'], ascending=[True, True]).reset_index(drop=True) # 3. 定义版本变化判断函数 def judge_version_change(prev_ver, curr_ver): if prev_ver is None: return 'initial' # 每个id的第一条记录,无前置版本 if curr_ver == prev_ver: return 'no change' # 处理无patch字段的版本(如1.0默认patch为0) prev_major, prev_minor, prev_patch = (prev_ver.major, prev_ver.minor, prev_ver.patch if hasattr(prev_ver, 'patch') else 0) curr_major, curr_minor, curr_patch = (curr_ver.major, curr_ver.minor, curr_ver.patch if hasattr(curr_ver, 'patch') else 0) minor_changed = curr_minor != prev_minor patch_changed = curr_patch != prev_patch if minor_changed and patch_changed: return 'minor-patch' elif minor_changed: return 'minor' elif patch_changed: return 'patch' else: # major版本变更的情况 return 'major' # 4. 对每个id组应用函数,生成标签列 df_sorted['change_label'] = df_sorted.groupby('id')['version_obj'].transform( lambda x: [judge_version_change(None, x.iloc[0])] + [judge_version_change(x.iloc[i-1], x.iloc[i]) for i in range(1, len(x))] ) # 可选:删除临时的version_obj列 df_sorted = df_sorted.drop(columns=['version_obj'])
关键说明
packaging.version.Version会自动解析不同格式的版本号,统一为major/minor/patch结构,完美兼容1.0这类两位版本(自动补patch=0);- 分组排序确保每个
id的版本记录严格按时间顺序排列,避免因原始数据顺序混乱导致的对比错误; - 函数中明确区分了版本无变化、minor+patch同时升级、单独minor/patch升级、major升级等场景,完全匹配需求。
内容的提问来源于stack exchange,提问作者Brie MerryWeather
相关产品推荐
相关产品推荐

