如何在Pandas DataFrame中标记分组内的最高版本值
Pandas按颜色分组并正确排序版本号标记最高版本
问题描述
现有如下DataFrame:
Fruit Color Version Lemon Green 1.4a Lemon Yellow 2.5.10 Lemon Blue 6.7.a Apple Green 1.1 Banana Yellow 2.5.8 Banana Black 6.8.a
需求是:
- 按
Color列分组 - 每组内按
Version列降序排序 - 新增
highest列,标记该行是否为对应颜色分组中的最高版本(1表示是,0表示否)
直接使用df.sort_values(by=['Color', 'Version'], ascending=False)会出现排序错误,比如Yellow分组中2.5.8会排在2.5.10之上,这是因为字符串排序逻辑和版本号的语义排序不匹配。
解决方案
核心是使用专门的版本号解析工具来处理Version列,确保排序符合版本号的语义规则。这里用packaging.version.parse来解析版本号:
步骤1:安装依赖(如果未安装)
pip install packaging
步骤2:完整实现代码
import pandas as pd from packaging.version import parse # 构造原始DataFrame data = { 'Fruit': ['Lemon', 'Lemon', 'Lemon', 'Apple', 'Banana', 'Banana'], 'Color': ['Green', 'Yellow', 'Blue', 'Green', 'Yellow', 'Black'], 'Version': ['1.4a', '2.5.10', '6.7.a', '1.1', '2.5.8', '6.8.a'] } df = pd.DataFrame(data) # 新增临时列,存储解析后的版本对象(用于正确排序) df['parsed_version'] = df['Version'].apply(parse) # 按Color分组,每组内按解析后的版本号降序排序 df = df.sort_values(by=['Color', 'parsed_version'], ascending=[True, False]) # 标记每组的最高版本:每组中版本号最大的行设为1,其余为0 df['highest'] = df.groupby('Color')['parsed_version'].transform(lambda x: x == x.max()).astype(int) # 清理临时列并调整列顺序 df = df.drop('parsed_version', axis=1)[['Fruit', 'Color', 'Version', 'highest']] print(df)
执行结果
Fruit Color Version highest 0 Lemon Green 1.4a 1 3 Apple Green 1.1 0 1 Lemon Yellow 2.5.10 1 4 Banana Yellow 2.5.8 0 5 Banana Black 6.8.a 1 2 Lemon Blue 6.7.a 1
原理说明
packaging.version.parse能正确识别带字母、多段的版本号语义,比如解析后2.5.10会被判定为比2.5.8版本更高,解决了字符串排序的逻辑错误。- 通过分组
transform方法,直接给每组中版本号最大的行标记为1,其余为0,无需手动遍历分组。
内容的提问来源于stack exchange,提问作者Cheburashka
相关产品推荐
相关产品推荐

