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

如何在Python的Pandas DataFrame中提取各分组列最大值的所有行?

提取Pandas分组中某列最大值对应的所有行

问题描述

有一个包含col1、col2、col3、col4列的Pandas DataFrame,需要提取每个col1分组中col2为最大值的所有行。

示例数据

col1  col2  col3   col4
A101  3     LLT    10028980
A101  7     LLT    10028980
A101  7     PT     10028980
A102  5     LLT    10028981
A102  3     PT     10028981 
A103  2     PT     10028982
A103  4     LLT    10028982

期望输出

col1  col2  col3   col4
A101  7     LLT    10028980
A101  7     PT     10028980
A102  5     LLT    10028981
A103  4     LLT    10028982

原代码问题

原代码使用groupby('col1').max()会直接取每个分组各列的最大值,过滤掉了同一分组中col2为最大值的多行记录:

m = df.notnull().all(axis=1)
df = df.loc[m].groupby('col1').max().reset_index()

得到的结果丢失了A101分组中col2=7的其中一行。

解决方案

可以通过以下几种方法实现需求:

方法1:使用transform匹配最大值

利用groupby.transform计算每个分组的col2最大值,然后筛选出col2等于该最大值的行:

# 先过滤空行(保留原逻辑)
m = df.notnull().all(axis=1)
df_clean = df.loc[m]

# 计算每个分组的col2最大值
max_col2_per_group = df_clean.groupby('col1')['col2'].transform('max')

# 筛选符合条件的行
result = df_clean[df_clean['col2'] == max_col2_per_group]

方法2:使用groupby.filter

通过filter方法直接筛选出每个分组中col2等于该分组最大值的行:

m = df.notnull().all(axis=1)
df_clean = df.loc[m]

result = df_clean.groupby('col1').filter(lambda x: x['col2'] == x['col2'].max())

方法3:使用rank

给每个分组内的col2按降序排名,筛选排名为1的行(支持并列最大值):

m = df.notnull().all(axis=1)
df_clean = df.loc[m]

df_clean['rank'] = df_clean.groupby('col1')['col2'].rank(ascending=False, method='min')
result = df_clean[df_clean['rank'] == 1].drop('rank', axis=1)

以上三种方法都能保留同一分组中col2为最大值的所有行,得到符合期望的输出。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 09:01:03