Python 多索引数据帧的索引排序顺序不符合分类索引顺序

Python 多索引数据帧的索引排序顺序不符合分类索引顺序,python,pandas,Python,Pandas,具有两级多索引和一列的小型数据帧。索引的第二列(级别1)将按字母顺序排序,将“四”置于“三”之前 import pandas as pd df = pd.DataFrame({'A':[1,1,2,2], 'B':['One','Two','Three', 'Four'], 'X':[1,2,3,4]}, index=range(4)).set_index(['A','B']).sort_index() df X A B 1 One 1

具有两级多索引和一列的小型数据帧。索引的第二列(级别1)将按字母顺序排序,将“四”置于“三”之前

import pandas as pd
df = pd.DataFrame({'A':[1,1,2,2],
  'B':['One','Two','Three', 'Four'], 
  'X':[1,2,3,4]},
  index=range(4)).set_index(['A','B']).sort_index()
df

         X
A B       
1 One    1
  Two    2
2 Four   4
  Three  3
很明显,索引(B)的第二级是按字母顺序排列的,因此可以用分类索引替换,以强制进行正确的排序

df.index.set_levels(pd.CategoricalIndex(df.index.levels[1], 
       categories=['One','Two','Three', 'Four'], ordered=True), 
    level=1, inplace=True)
完成这项检查后,索引显示级别1确实是一个分类索引。但是,对索引进行排序并不会将行按所需的顺序排列

df.sort_index()

         X
A B       
1 One    1
  Two    2
2 Four   4
  Three  3

注意:如果数据帧的简单索引为1级,则只能按预期工作。

我在创建数据帧后通过设置索引来实现这一点-不确定这是否是最佳答案,但这是一个答案:

df = pd.DataFrame({'A':[1,1,2,2],
   'B':['One','Two','Three', 'Four'], 
   'X':[1,2,3,4]})
df = df.set_index(['A', pd.CategoricalIndex(df['B'], categories=['One','Two','Three', 'Four'], ordered=True)])
del df['B']

谢谢你的努力。它创建的分类索引存在差异,不完全确定这种差异意味着什么,但它确实有效。如果指定创建数据帧的顺序,是否可以不使用
sort\u index