如何在Pandas的groupby操作中保留所有列并获取指定列最大值?
Pandas按ID分组保留academic_level最大值所在行
输入数据
| ID | academic_level | sex | location |
|---|---|---|---|
| 1 | 9 | 1 | 3 |
| 1 | 1 | 2 | 3 |
| 2 | 5 | 1 | 4 |
| 2 | 7 | 2 | 4 |
期望输出
| ID | academic_level | sex | location |
|---|---|---|---|
| 1 | 9 | 1 | 3 |
| 2 | 7 | 2 | 4 |
解决方案
方法1:利用groupby+idxmax定位最大值行
通过分组找到每组中academic_level最大值对应的索引,再从原DataFrame中提取这些索引对应的完整行:
import pandas as pd # 构造输入DataFrame df = pd.DataFrame({ 'ID': [1, 1, 2, 2], 'academic_level': [9, 1, 5, 7], 'sex': [1, 2, 1, 2], 'location': [3, 3, 4, 4] }) # 获取每组academic_level最大值的索引 max_row_indices = df.groupby('ID')['academic_level'].idxmax() # 提取对应行并重置索引 result = df.loc[max_row_indices].reset_index(drop=True) print(result)
方法2:排序后去重
先按ID升序、academic_level降序排序,再保留每个ID的第一行(即最大值所在行):
result = df.sort_values(by=['ID', 'academic_level'], ascending=[True, False]) \ .drop_duplicates(subset='ID', keep='first') \ .reset_index(drop=True) print(result)
两种方法都能得到期望的输出,可根据实际数据规模和需求选择:方法1逻辑更直接,适合中小数据集;方法2在需要多字段排序时更灵活。
内容的提问来源于stack exchange,提问作者Ramiro Guzmán
相关产品推荐
相关产品推荐

