Python 多索引数据帧的索引排序顺序不符合分类索引顺序
具有两级多索引和一列的小型数据帧。索引的第二列(级别1)将按字母顺序排序,将“四”置于“三”之前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
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
?