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

基于文本版本去重并筛选最新版本,求Pandas更优解决方案

更优解决方案:按版本优先级筛选每个Id的最新数据

你的当前方法确实能实现需求,但可以通过更简洁高效的方式完成,这里有两个直观的替代方案:

方案1:利用有序分类(Categorical)直接筛选

这个方法最贴合需求逻辑——我们可以直接给Version列指定优先级顺序,让Pandas按照这个规则判断"最高版本":

import pandas as pd

# 构造示例数据集
data = pd.DataFrame({
    'Id': [1, 1, 2, 2],
    'Score': [67, 89, 78, 70],
    'Version': ['One', 'Three', 'Two', 'One']
})

# 将Version转为有序分类,明确优先级:One < Two < Three
data['Version'] = pd.Categorical(
    data['Version'],
    categories=['One', 'Two', 'Three'],
    ordered=True
)

# 按Id分组,取出每组中Version优先级最高的行
result = data.loc[data.groupby('Id')['Version'].idxmax()]
print(result)

运行后直接输出期望结果:

Id  Score Version
1   1     89   Three
2   2     78     Two

方案2:用映射字典生成权重,简化筛选

如果你偏好数值权重的思路,也可以用字典直接映射版本到优先级数值,避免生成冗余的dummy列:

import pandas as pd

data = pd.DataFrame({
    'Id': [1, 1, 2, 2],
    'Score': [67, 89, 78, 70],
    'Version': ['One', 'Three', 'Two', 'One']
})

# 定义版本-权重映射,优先级越高数值越大
version_weight_map = {'One': 1, 'Two': 2, 'Three': 3}
data['version_weight'] = data['Version'].map(version_weight_map)

# 按Id分组找到权重最大的行,再删除临时权重列
result = data.loc[data.groupby('Id')['version_weight'].idxmax()].drop('version_weight', axis=1)
print(result)

这两个方案的优势:

  • 代码更简洁,可读性更强,无需拼接多个DataFrame
  • 内存占用更低,避免生成多余的dummy列
  • 逻辑更直接,完全围绕"版本优先级筛选"的核心需求展开

内容的提问来源于stack exchange,提问作者Nabih Bawazir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:17:46