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

如何在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

需求是:

  1. 按Color列分组
  2. 每组内按Version列降序排序
  3. 新增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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:35:15