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

如何用Python按列分组,提取指定列前N大值并返回对应完整行

Pandas分组获取指定列前N大值的完整行数据

嘿,我来帮你搞定这个Pandas分组取前N大值的问题!下面分通用方法和你的具体需求场景来讲解:

一、通用实现思路

想要对某一列分组后,获取另一列前N大值对应的完整行,最直观的方式是结合groupby()和apply(),搭配nlargest()方法——逻辑简单易懂,适合大多数日常场景。

举个通用示例:假设你有一个DataFrame df,要按group_col列分组,提取value_col列前N大值对应的所有行:

import pandas as pd

# 构造示例数据
df = pd.DataFrame({
    'group_col': ['A', 'A', 'A', 'B', 'B', 'B'],
    'value_col': [10, 20, 30, 5, 15, 25],
    'other_col': ['x', 'y', 'z', 'm', 'n', 'p']
})

# 核心代码:分组后取前2大值的完整行
result = df.groupby('group_col').apply(lambda x: x.nlargest(2, 'value_col')).reset_index(drop=True)
print(result)

这里的关键细节:

  • groupby('group_col') 指定分组的依据列
  • apply(lambda x: x.nlargest(N, 'value_col')) 对每个分组单独执行“取指定列前N大值”操作,同时保留整行数据
  • reset_index(drop=True) 清理分组产生的多级索引,让结果更整洁

如果你的数据量特别大,apply()效率可能稍低,这时候可以用rank()方法做高效筛选:

# 用rank实现更快的筛选
df['rank'] = df.groupby('group_col')['value_col'].rank(ascending=False, method='first')
result = df[df['rank'] <= 2].drop('rank', axis=1).reset_index(drop=True)
print(result)

二、针对你的具体需求:按col2分组取col5前2大值

假设你的原始数据是这样的:

col1col2col3col4col5
1Xfoobar100
2Xfoobar200
3Xfoobar150
4Yfoobar50
5Yfoobar150
6Yfoobar100

直接套用通用方法,代码如下:

# 按col2分组,取col5前2大的完整行
result = df.groupby('col2').apply(lambda x: x.nlargest(2, 'col5')).reset_index(drop=True)

运行后得到的结果完全符合你的期望:

col1col2col3col4col5
2Xfoobar200
3Xfoobar150
5Yfoobar150
6Yfoobar100

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:18:52