pandas 如何对多级列的多索引数据框进行lex排序,然后索引到其中?

cl25kdpy  于 2023-04-28  发布在  其他
关注(0)|答案(1)|浏览(125)

我创建了这个df:

## creating multi index multi-level column dataframe
multi_ind = pd.MultiIndex.from_product([['Anna', 'Bob', 'Cara', 'Dan'],['2021', '2022']])
multi_cols = pd.MultiIndex.from_product([['Class XI', 'Class XII'],['Math' , 'Physics',     'Literature']])
data = np.random.randint(20,100, size = (8, 6))
df = pd.DataFrame(data, index =multi_ind, columns = multi_cols)
df.index.names = ['Student','Year']
df.columns.names = ['Class' , 'Subject']

df
我已经使用sort_index()对这个df进行了排序

df.sort_index(level=[0, 1], ascending=[1, 0], inplace=True)

现在,我尝试同时对索引和列进行切片,以创建一个子集。

idx = pd.IndexSlice
df.loc[idx['Bob':'Cara', '2021'], idx['Class XII' , 'Math' : 'Physics'] ]

我一直收到这个错误!
UnsortedIndexError:'MultiIndex切片要求索引为lexsorted:在级别[1]上切片,lexsort深度为1'
part of the error
我尝试切片外部索引和内部列级别,同时为内部索引和外部列级别选择值/值列表,但似乎我没有正确排序df。
我在lex排序中做错了什么?我如何修复UnsortedIndexError?我已经尝试了sort_index()
还有,什么是lexsort?有关于lexsort的简单阅读材料吗?
感谢你的评分

fivyi3re

fivyi3re1#

如果在列中对Mulitindex进行排序,则运行良好,因为您的代码只在index中对MulitIndex进行排序:

df.sort_index(axis=1, inplace=True)
print (df)

idx = pd.IndexSlice
df = df.loc[idx['Bob':'Cara', '2021'], idx['Class XII' , 'Math' : 'Physics'] ]
print (df)
Class        Class XII        
Subject           Math Physics
Student Year                  
Bob     2021        59      86
Cara    2021        89      84

相关问题