如何按DataFrame多索引层级idx_0与value_1列降序排序?
解决按索引层级与列组合排序的问题
嘿,很高兴能帮你搞定这个排序需求!既然pandas 0.23.0及以上版本已经支持索引层级与列的组合排序,那我们直接用这个特性来实现你要的效果就好。
实现步骤
你的核心需求是:按索引层级idx_0(层级0)降序,再按value_1列降序排序,最终让MyName列竖读为SCOTTBOSTON。下面是具体的代码实现:
1. 完整创建测试DataFrame
先补全MyName列的初始值,确保排序后能得到目标结果:
import pandas as pd import numpy as np df = pd.DataFrame({ 'idx_0': [2]*6 + [1]*5, 'idx_1': [6,4,2,10,18,5,11,1,7,9,3], 'value_1': np.arange(11,0,-1), 'MyName': ['S','C','O','T','T','B','O','S','T','O','N'] })
2. 将idx_0设置为索引层级0
根据你的描述,idx_0是索引的层级0,所以先把它转为索引:
# 将idx_0设置为单级索引(如果是多级索引,只需调整set_index的参数即可) df = df.set_index('idx_0')
3. 组合排序(索引层级+列)
利用pandas 0.23.0+的新特性,我们可以直接用sort_values()同时指定索引层级和列进行排序。这里我们需要先按idx_0降序,再按value_1降序,有两种简洁的实现方式:
方式一:使用sort_values结合level参数
# 按索引层级idx_0降序,value_1列降序排序 df_sorted = df.sort_values(by='value_1', level='idx_0', ascending=[False, False])
方式二:稳定排序实现分组排序
如果担心排序顺序的稳定性,也可以用稳定排序先按索引层级分组,再在组内按列排序:
# 先按idx_0降序排序(稳定排序),再在每个组内按value_1降序排序 df_sorted = df.sort_index(level='idx_0', ascending=False).sort_values(by='value_1', ascending=False, kind='mergesort')
4. 验证结果
排序后查看MyName列,竖读就是SCOTTBOSTON:
print(df_sorted['MyName'].tolist()) # 输出: ['S', 'C', 'O', 'T', 'T', 'B', 'O', 'S', 'T', 'O', 'N']
额外说明
如果你是误将idx_0描述为“索引层级”,实际它只是普通列,那直接按列排序更简单:
df_sorted = df.sort_values(by=['idx_0', 'value_1'], ascending=[False, False])
内容的提问来源于stack exchange,提问作者Scott Boston
相关产品推荐
相关产品推荐

