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

Pandas DataFrame分组去重并保留cnt列最大值行

Pandas分组保留cnt列最大值对应的行

问题场景

你有如下结构的DataFrame,需要按name、size、yr分组,每组内保留cnt数值最大的对应行:

import pandas as pd
import numpy as np

df = pd.DataFrame({
                   'name': ['p1', 'p1', 'p2', 'p2'],
                   'size': [10, 10, 20, 20],
                   'yr': [1990, 1990, 2000, 2000],
                   'res': [1, 2, 1, 2],
                   'cnt': [100, 80, 220, 400]
                  })

期望输出:

name  size    yr  res  cnt
0   p1    10  1990    1  100
3   p2    20  2000    2  400

解决方案

方法1:使用groupby + idxmax

先按分组列(name、size、yr)分组,定位每组cnt最大值对应的行索引,再提取目标行:

# 定义分组依据的列
group_keys = ['name', 'size', 'yr']
# 获取每组cnt最大值的行索引
max_cnt_idx = df.groupby(group_keys)['cnt'].idxmax()
# 提取对应行并重置索引
result = df.loc[max_cnt_idx].reset_index(drop=True)
print(result)

方法2:使用sort_values + drop_duplicates

先按分组列升序、cnt降序排序,再按分组列去重并保留第一行(即cnt最大的行):

# 排序:分组列升序,cnt降序
sorted_df = df.sort_values(by=[*group_keys, 'cnt'], ascending=[True, True, True, False])
# 按分组列去重,保留第一个(cnt最大的)
result = sorted_df.drop_duplicates(subset=group_keys, keep='first').reset_index(drop=True)
print(result)

两种方法均能得到目标结果:方法1在大数据量下效率更高,方法2逻辑更直观易懂。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:50:35