如何实现DataFrame两类去重:多列去重及条件筛选
解决两类Pandas DataFrame数据处理需求
需求1:基于两列去重,保留指定列值更大的行
这种分组取极值的场景我平时常用两种方法,看你偏好哪种:
方法1:排序后去重(直观易理解)
先按分组列+目标列降序排序,这样每组里值最大的行自然排在最前面,再用drop_duplicates保留每组第一条就行。假设你的DataFrame是df,要基于col1和col2去重,保留col3值最大的行:
# 按分组列升序、目标列降序排序(分组列顺序不影响,只要统一就行) sorted_df = df.sort_values(by=['col1', 'col2', 'col3'], ascending=[True, True, False]) # 去重,保留每组第一条(也就是col3最大的行) result_df = sorted_df.drop_duplicates(subset=['col1', 'col2'], keep='first')
方法2:Groupby+Idxmax(高效直接)
直接通过分组找到目标列最大值对应的索引,再筛选行,数据量大的时候这种方法更快:
# 按col1和col2分组,获取col3最大值所在的行索引 max_row_indices = df.groupby(['col1', 'col2'])['col3'].idxmax() # 根据索引提取目标行,重置索引让结果更整洁 result_df = df.loc[max_row_indices].reset_index(drop=True)
需求2:在已排序DataFrame中筛选符合条件的记录并保留最优行
先理清楚你的核心需求:原DataFrame已经按Calved降序排列,之前是每个Calved日期下保留每个ProfileID的一条记录,但现在要改成先筛选出Calved < Served的行,再在每个Calved日期+ProfileID的组合里保留符合预期的行(比如你例子里更想要Served列更优的第14行)
步骤1:先筛选符合条件的行
第一步先把不满足Calved < Served的行过滤掉:
# 过滤出Calved日期早于Served日期的行 filtered_df = df[df['Calved'] < df['Served']]
步骤2:保留每个组合的最优行
假设你要保留每个ProfileID+Calved组合里Served最大的行(对应你说的更想保留第14行的场景),同样可以用上面的两种方法:
方法1:排序后去重(延续原DataFrame的排序逻辑)
# 保持Calved降序,再按ProfileID、Served降序排序,确保最优行在每组最前面 sorted_filtered = filtered_df.sort_values(by=['Calved', 'ProfileID', 'Served'], ascending=[False, True, False]) # 去重,保留每个ProfileID+Calved组合的第一条 final_df = sorted_filtered.drop_duplicates(subset=['ProfileID', 'Calved'], keep='first')
方法2:Groupby+Idxmax(高效定位最优行)
# 按ProfileID和Calved分组,找到Served最大值对应的行索引 max_served_indices = filtered_df.groupby(['ProfileID', 'Calved'])['Served'].idxmax() # 提取行后重新按Calved降序排列,和原DataFrame排序保持一致 final_df = filtered_df.loc[max_served_indices].sort_values(by='Calved', ascending=False).reset_index(drop=True)
如果你的“最优”规则不是Served最大,只需要把代码里的Served换成对应的列或者调整排序逻辑就可以了。
内容的提问来源于stack exchange,提问作者Nosey
相关产品推荐
相关产品推荐

