多索引数据框的索引排序顺序不遵循分类索引顺序

时间:2018-03-16 10:22:51

标签: 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
  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级,则只能按预期工作。

1 个答案:

答案 0 :(得分: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']