如何基于Package.ID和WeekID去重并保留Version最大值的行?
解决多列重复时保留指定列最大值行的问题
这问题我熟!处理这种按Package.ID和WeekID双列去重、同时保留每组Version最大值行的需求,用Pandas有两种高效且直观的方法,完全适配你的30万行数据量:
方法一:排序后去重(直观易懂)
核心思路是先让每组内的行按Version降序排列,这样每组里Version最大的行会排在最前面,再删除双列重复的行时保留第一个即可:
import pandas as pd # 假设你的DataFrame名为df # 按Package.ID、WeekID升序,Version降序排序 df_sorted = df.sort_values( by=['Package.ID', 'WeekID', 'Version'], ascending=[True, True, False] ) # 删除Package.ID和WeekID重复的行,保留第一个(即Version最大的行) df_result = df_sorted.drop_duplicates( subset=['Package.ID', 'WeekID'], keep='first' ) # 可选:重置索引,让结果更整洁 df_result = df_result.reset_index(drop=True)
方法二:分组取最大索引(内存友好)
如果你的数据量特别大,这种方法在内存使用上会更高效——先通过分组找到每组Version最大值对应的行索引,再直接提取这些行:
# 获取每组(Package.ID + WeekID)中Version最大的行的索引 max_version_indices = df.groupby(['Package.ID', 'WeekID'])['Version'].idxmax() # 根据索引提取目标行 df_result = df.loc[max_version_indices].reset_index(drop=True)
效果验证
针对你给出的示例数据,两种方法都会得到你期望的结果:
- 对于
Package.ID=2803789且WeekID=201605的分组,会保留Version=4.2的Brad行; - 其他无重复双列的行都会完整保留。
注意事项
- 确保
Version列是数值类型(int/float),否则无法正确比较大小; - 如果同一分组内有多个行的
Version值相同且都是最大值,两种方法都会保留该组中最先出现的那一行,符合常规需求。
内容的提问来源于stack exchange,提问作者Joey
相关产品推荐
相关产品推荐

