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

如何按Pandas DataFrame的MultiIndex和值排序?按src升序、sum降序

解决Pandas二级MultiIndex的混合排序需求

嘿,作为Pandas初学者能想到要结合sort_index()和sort_values()来解决这个问题,已经找对方向啦!刚好这个需求确实需要两者配合,我给你一步步拆解操作,再用示例帮你理解👇

先构造一个和你场景匹配的示例数据

假设你通过groupby()得到的二级MultiIndex DataFrame是这样的(src是第一级索引,dest是第二级):

import pandas as pd

# 模拟原始数据
data = {
    'src': ['A', 'A', 'B', 'B', 'C', 'C'],
    'dest': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
    'sum': [10, 20, 5, 15, 25, 18]
}
df = pd.DataFrame(data)

# 生成二级MultiIndex的分组结果(和你的场景一致)
grouped_df = df.groupby(['src', 'dest']).sum()

此时grouped_df的结构是:

sum
src dest     
A   X      10
    Y      20
B   X       5
    Y      15
C   X      25
    Y      18

实现「src升序、每个src下sum降序」的排序

这里有两种高效的实现方式,你可以根据习惯选择:

方法一:先分组内排序,再统一索引排序

先对每个src分组单独按sum降序排序,再强制src整体升序:

# 按src分组,每个组内按sum降序排列(group_keys=False避免额外添加分组键)
group_sorted = grouped_df.groupby(level='src', group_keys=False).apply(
    lambda x: x.sort_values('sum', ascending=False)
)

# 确保src整体按升序排列(sort_remaining=False保留组内的排序结果)
final_sorted = group_sorted.sort_index(level='src', ascending=True, sort_remaining=False)

方法二:先全局按sum降序,再按src升序锁定分组

先把所有行按sum降序排好,再只对src这一级索引升序排序,同时保留组内的顺序:

# 先按sum列全局降序排序
sorted_by_sum = grouped_df.sort_values('sum', ascending=False)

# 仅对src索引升序排序,不改变组内的顺序(关键参数sort_remaining=False)
final_sorted = sorted_by_sum.sort_index(level='src', ascending=True, sort_remaining=False)

最终预期结果

两种方法得到的结果一致,都是每个src升序排列,且每个src下的行按sum从大到小排列:

sum
src dest     
A   Y      20
    X      10
B   Y      15
    X       5
C   X      25
    Y      18

关键知识点解释

  • level='src':指定只针对MultiIndex中的src这一级进行操作
  • sort_remaining=False:这是核心参数,意思是只排序指定的索引级别,不改变其他级别(比如这里的dest)的相对顺序,这样就能保证每个src分组内的sum排序不会被打乱
  • groupby(level='src').apply(...):针对每个src分组单独执行排序逻辑,适合需要对分组做更复杂操作的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:21:05