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

如何在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),然后通过多条件排序来实现你的需求:

  1. 用groupby.transform计算每个Major组的最高GPA,作为组排序的核心依据
  2. 按「组最高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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 14:12:27