基于文本版本去重并筛选最新版本,求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
相关产品推荐
相关产品推荐

