Порядок сортировки индекса в многоиндексном фрейме данных не соответствует порядку категориального индекса

Небольшой фрейм данных с двухуровневым мультииндексом и одним столбцом. Второй столбец (уровень 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 уровня, только это работает должным образом.


person Ymareth    schedule 16.03.2018    source источник
comment
Если вы укажете порядок создания фрейма данных, не могли бы вы просто не использовать sort_index?   -  person jpp    schedule 16.03.2018


Ответы (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']
person gyx-hh    schedule 16.03.2018
comment
Спасибо за попытку. В создаваемом им CategoryIndex есть разница, не совсем уверен, что это за разница, но она определенно работает. - person Ymareth; 16.03.2018