Python 如何根据熊猫数据帧';什么是多重索引?

Python 如何根据熊猫数据帧';什么是多重索引?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个熊猫数据框,如下所示 data = pd.DataFrame({ 'x': [10, 9, 8, 4], 'y': [1, 2, 3, 4], }) data.index = pd.MultiIndex.from_tuples([ ('high', 'high'), ('high', 'low'), ('low', 'high'), ('low', 'low') ], names=['score', 'grade']) 我想根据2

我有一个熊猫数据框,如下所示

data = pd.DataFrame({
    'x': [10, 9, 8, 4],
    'y': [1, 2, 3, 4],
})

data.index = pd.MultiIndex.from_tuples([
    ('high', 'high'), 
    ('high', 'low'), 
    ('low', 'high'), 
    ('low', 'low')
], names=['score', 'grade'])
我想根据2个索引对这个数据框进行排序
score
grade
。我希望对这两个索引进行排序,使
low
位于
high
之前。我该怎么做

我在下面尝试了这段代码,但只有第一个索引
score
按需要排序

data.sort_index(level=[0, 1], key=lambda s: sorted(s, reverse=True))
-- before/after for score Index(['high', 'high', 'high', 'medium', 'medium', 'medium', 'low', 'low', 'low'], dtype='object', name='score') Index(['low', 'low', 'low', 'medium', 'medium', 'medium', 'high', 'high', 'high'], dtype='object', name='score') -- before/after for grade Index(['high', 'medium', 'low', 'high', 'medium', 'low', 'high', 'medium', 'low'], dtype='object', name='grade') Index(['low', 'low', 'low', 'medium', 'medium', 'medium', 'high', 'high', 'high'], dtype='object', name='grade') 关于如何根据多个索引进行自定义排序,有什么想法吗?我试图创建一个自定义排序函数进行调试。下面是我的尝试

def do_sort(s):
    print(s)
    
    r = pd.Index(sorted(s, reverse=True), name=s.name)
    print(r)
    
    return r

data.sort_index(level=[0, 1], key=do_sort)
产出结果与预期一致。这些值按照我的要求进行排序

-- before and after for score Index(['high', 'high', 'low', 'low'], dtype='object', name='score') Index(['low', 'low', 'high', 'high'], dtype='object', name='score') -- before and after for grade Index(['high', 'low', 'high', 'low'], dtype='object', name='grade') Index(['low', 'low', 'high', 'high'], dtype='object', name='grade') 记录的输出如下所示。正如您所看到的,我得到了正确的排序(低、中、高),但是
得分
索引只根据需要排序

data.sort_index(level=[0, 1], key=lambda s: sorted(s, reverse=True))
-- before/after for score Index(['high', 'high', 'high', 'medium', 'medium', 'medium', 'low', 'low', 'low'], dtype='object', name='score') Index(['low', 'low', 'low', 'medium', 'medium', 'medium', 'high', 'high', 'high'], dtype='object', name='score') -- before/after for grade Index(['high', 'medium', 'low', 'high', 'medium', 'low', 'high', 'medium', 'low'], dtype='object', name='grade') Index(['low', 'low', 'low', 'medium', 'medium', 'medium', 'high', 'high', 'high'], dtype='object', name='grade') --得分前/后 指数([‘高’、‘高’、‘高’、‘中’、‘中’、‘低’、‘低’, “低”], dtype='object',name='score') 指数([‘低’、‘低’、‘低’、‘中’、‘中’、‘中’、‘高’、‘高’, “高”], dtype='object',name='score') --评分前/后 指数([‘高’、‘中’、‘低’、‘高’、‘中’、‘低’、‘高’、‘中’, “低”], dtype='object',name='grade') 指数([‘低’、‘低’、‘低’、‘中’、‘中’、‘中’、‘高’、‘高’, “高”], dtype='object',name='grade')
尝试使用
升序

out = data.sort_index(ascending=[True,False])
              x  y
score grade       
high  low     9  2
      high   10  1
low   low     4  4
      high    8  3
#data.sort_index(ascending=[False,False])
#              x  y
#score grade       
#low   low     4  4
#      high    8  3
#high  low     9  2
#      high   10  1

好的,你抓住我了。但实际上,虽然这是我的错,但我有3个值,“高”、“中”和“低”,这就是为什么我需要走定制的关键路线。对不起,我已经更新了示例。