基于DataFrame检测版本回退并按ID统计次数的实现方案
问题描述
给定如下DataFrame:
id info_version 124 2.0.0 124 2.0.0 124 1.0.0 124 1.5.6 124 0.4.5 345 v2alpha1 345 v1alpha1 348 1.0.0-Snapshot 348 1.0.0-Snapshot
需要按id统计info_version字段的版本回退次数(比如从2.0.0到1.0.0、v2到v1都算回退),最终输出格式如下:
id count 124 2 345 1 348 0
解决方案
步骤1:安装依赖
若未安装packaging库,执行以下命令:
pip install packaging
步骤2:代码实现
import pandas as pd from packaging import Version # 构造示例DataFrame df = pd.DataFrame({ 'id': [124, 124, 124, 124, 124, 345, 345, 348, 348], 'info_version': ['2.0.0', '2.0.0', '1.0.0', '1.5.6', '0.4.5', 'v2alpha1', 'v1alpha1', '1.0.0-Snapshot', '1.0.0-Snapshot'] }) # 统一解析版本号,处理带v前缀的情况 def parse_version(v): if v.startswith('v'): v = v[1:] return Version(v) # 统计单组内的版本回退次数 def count_rollbacks(group): versions = group['info_version'].apply(parse_version) # 比较当前版本与前一个版本,统计回退次数 return (versions.shift(1) > versions).sum() # 按id分组统计 result = df.groupby('id').apply(count_rollbacks).reset_index(name='count') print(result)
代码说明
parse_version函数:移除版本号开头的v前缀,用Version类统一解析,确保不同格式的版本(如正式版、预发布版、快照版)能正确比较。count_rollbacks函数:对每个id的版本序列,通过shift(1)获取前一个版本,统计当前版本小于前一个版本的次数,即回退次数。- 最终通过
groupby+apply完成按id的聚合统计,输出符合要求的结果。
运行结果
执行代码后输出:
id count 0 124 2 1 345 1 2 348 0
内容的提问来源于stack exchange,提问作者Brie MerryWeather
相关产品推荐
相关产品推荐

