如何在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结果如下:
| Brand | Product | Rank |
|---|---|---|
| A | P3 | 2000 |
| A | P2 | 1210 |
| B | P3 | 3490 |
| B | P4 | 2341 |
| C | P5 | 4032 |
| C | P4 | 1202 |
内容的提问来源于stack exchange,提问作者Dys_Lexi_A
相关产品推荐
相关产品推荐

