如何在Pandas中按Major分组(sort=False)后依据GPA列对外部分组进行排序?
实现按GPA优先级排序分组后的DataFrame
首先我完全理解你的需求:你希望按Major分组,但组的顺序要根据各组的GPA整体水平(最高GPA)降序排列,同时每个组内部也要按GPA降序排列,并且保留同组同GPA记录的原始顺序(比如A组的Type1和4保持原始先后顺序)。
原始数据构造
先把你给出的DataFrame用代码还原出来:
import pandas as pd df = pd.DataFrame({ 'Type': [1, 2, 3, 4, 5, 6], 'Major': ['A', 'B', 'C', 'A', 'B', 'C'], 'GPA': [0, 1, 0, 0, 0, 1] })
实现步骤
核心思路是给每条记录添加一个组级别的排序标识(即该Major组的最高GPA),然后通过多条件排序来实现你的需求:
- 用
groupby.transform计算每个Major组的最高GPA,作为组排序的核心依据 - 按「组最高GPA降序 → 自身GPA降序 → Type升序」的规则排序,最后删除临时添加的标识列
完整代码
# 1. 添加组内最大GPA作为分组排序的临时键 df['group_gpa_rank'] = df.groupby('Major')['GPA'].transform('max') # 2. 多条件排序:先按组的最高GPA降序,再按自身GPA降序,最后按Type升序(保留同GPA的原始顺序) result_df = df.sort_values( by=['group_gpa_rank', 'GPA', 'Type'], ascending=[False, False, True] ).drop('group_gpa_rank', axis=1) # 重置索引并查看结果 print(result_df.reset_index(drop=True))
输出结果
运行后得到的结果完全符合你的期望:
Type Major GPA 0 2 B 1 1 5 B 0 2 6 C 1 3 3 C 0 4 1 A 0 5 4 A 0
补充说明
如果你的同组同GPA记录不需要按Type排序,只想严格保留原始数据的行顺序,可以把Type从排序条件中去掉,换成df.index来锁定原始顺序:
result_df = df.sort_values( by=['group_gpa_rank', 'GPA', df.index], ascending=[False, False, True] ).drop('group_gpa_rank', axis=1)
内容的提问来源于stack exchange,提问作者BenSeedGangMu
相关产品推荐
相关产品推荐

