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

如何在pandas中按分组获取每组的Top2最大值?

嘿,我来帮你搞定这个分组取Top2的问题!你之前用df.nlargest(2, 'Rank')只能拿到全局排名前2的产品,要实现按Brand分组提取每组的Top2,用pandas的分组功能就能轻松解决,下面给你两种实用的方法:

方法一:groupby + apply + nlargest(直观易懂)

这种方法逻辑清晰,适合快速实现需求,代码如下:

Top_Products = df.groupby('Brand').apply(lambda x: x.nlargest(2, 'Rank')).reset_index(drop=True)

代码细节解释:

  • df.groupby('Brand'):将原始数据按照Brand字段拆分为A、B、C三个独立的分组
  • .apply(lambda x: x.nlargest(2, 'Rank')):对每个分组(即单个Brand下的所有产品数据),调用nlargest方法提取Rank值最高的2条记录
  • .reset_index(drop=True):重置结果的索引,去掉分组带来的多级索引,让最终的数据结构更简洁规整
方法二:groupby + rank(高效适配大数据集)

如果你的数据量很大,这种方法的性能会更优,它通过标记组内排名来筛选目标数据:

# 给每个Brand分组内的产品按Rank降序排名
df['rank_in_brand'] = df.groupby('Brand')['Rank'].rank(ascending=False, method='first')
# 筛选排名前2的产品,再删除临时排名列
Top_Products = df[df['rank_in_brand'] <= 2].drop('rank_in_brand', axis=1)

代码细节解释:

  • df.groupby('Brand')['Rank'].rank(ascending=False, method='first'):在每个Brand分组内,对Rank字段进行降序排名,method='first'参数可以避免出现相同Rank值时排名重复的情况
  • 筛选rank_in_brand≤2的记录,就能得到每组的Top2产品,最后删掉临时生成的排名列即可

用你提供的测试数据运行后,最终得到的Top_Products结果如下:

BrandProductRank
AP32000
AP21210
BP33490
BP42341
CP54032
CP41202

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:31:08