Python 切片多索引的两个不同级别时出错

Python 切片多索引的两个不同级别时出错,python,pandas,multi-index,Python,Pandas,Multi Index,我在尝试分割多索引的两个级别时收到一条意外的错误消息…关于如何操作有什么帮助吗?请看附件中的代码 我正在运行Python 3.7.1和Pandas 0.23.4 我有这个数据框: import pandas as pd import itertools index = list(itertools.product(['Ada','Quinn','Violet','Juan'],['Physics', 'Chemistry','Math','English'])) headr = lis

我在尝试分割多索引的两个级别时收到一条意外的错误消息…关于如何操作有什么帮助吗?请看附件中的代码

我正在运行Python 3.7.1和Pandas 0.23.4

我有这个数据框:

import pandas as pd
import itertools
index = list(itertools.product(['Ada','Quinn','Violet','Juan'],['Physics', 
    'Chemistry','Math','English']))
headr = list(itertools.product(['Exams','Labs', 'Particip'], 
    ['I','II','III','IV']))
indx = pd.MultiIndex.from_tuples(index,names=['Student','Course'])
cols = pd.MultiIndex.from_tuples(headr) #Notice these are un-named
data = [[70+x+y+(x*y)%3 for x in range(12)] for y in range(16)]
df = pd.DataFrame(data,indx,cols)
dfls=df.sort_index(level=0);dfls
正如您在下面看到的,我可以毫无问题地将数据帧分为一个级别:

dfls.loc[(('Ada','Quinn'),('Math','Chemistry')),('Labs',('I','IV'))]
获取:

                            Labs
                            I   IV
Student     Course      
Ada         Chemistry       76  79
            Math            78  81
Quinn       Chemistry       81  84
            Math            80  83   
但当我尝试使用两种不同的级别时:

dfls.loc[(('Ada','Quinn'),('Math','Chemistry')),[('Exams',('I','III')), 
('Labs',('II','IV'))]]
我收到以下错误消息:

ValueError: setting an array element with a sequence
如何避免此错误消息并获得所需的结果?
提前感谢您……

您需要传递一个元组列表,以便对列进行切片

idx = (('Ada','Quinn'),('Math','Chemistry'))
cols = [('Exams', 'I'), ('Exams', 'III'), ('Labs', 'II'), ('Labs', 'IV')] 
dfls.loc[idx, cols]

                  Exams     Labs    
                      I III   II  IV
Student Course                      
Ada     Chemistry    71  75   78  79
        Math         72  75   78  81
Quinn   Chemistry    75  78   81  84
        Math         76  78   81  83
索引标签被简化的原因是,您正在为每个级别切片相同的子级别。这不是列的情况,因此您需要分别拼写每个列


您可以在上阅读有关基于多索引的切片的更多信息。

您需要传递一个元组列表,以便对列进行切片

idx = (('Ada','Quinn'),('Math','Chemistry'))
cols = [('Exams', 'I'), ('Exams', 'III'), ('Labs', 'II'), ('Labs', 'IV')] 
dfls.loc[idx, cols]

                  Exams     Labs    
                      I III   II  IV
Student Course                      
Ada     Chemistry    71  75   78  79
        Math         72  75   78  81
Quinn   Chemistry    75  78   81  84
        Math         76  78   81  83
索引标签被简化的原因是,您正在为每个级别切片相同的子级别。这不是列的情况,因此您需要分别拼写每个列


您可以在上阅读有关基于多索引的切片的更多信息。

现在我明白了,多亏了@coldspeed answer,我要寻找的一行答案是:


dfls.loc[('Ada','Quinn'),('Math','Chemistry'),[('tests','I'),('tests','III'),('Labs','II'),('Labs','IV')]
现在我明白了,多亏了@coldspeed answer,我想要的一行答案是:


dfls.loc[('Ada','Quinn'),('Math','Chemistry'),[('tests','I'),('tests','III'),('Labs','II'),('Labs','IV')]问题是从列SLICE问题是从列SLILLookes,我需要编辑我的帖子来解决这个特定的情况…@ JoeEuLuSimaMeNez请考虑损坏答案,如果它损坏了你的问题。TIA.但是,如果这是原因,我在应用时是如何得到结果的:dfls.loc[(('Ada','Quinn'),('Math','Chemistry'),('Labs',('I','IV'))]?@JoséLuisMartínez你只是在一个较高的层次上切片,所以熊猫更容易理解你在做什么。@JoséLuisMartínez。。。如果这回答了你的问题。看起来我需要编辑我的帖子来解决这个特殊的情况……JoeEuLusiMa'Nez请考虑损坏答案,如果它损坏了你的问题。TIA.但是,如果这是原因,我在应用时是如何得到结果的:dfls.loc[(('Ada','Quinn'),('Math','Chemistry'),('Labs',('I','IV'))]?@JoséLuisMartínez你只是在一个较高的层次上切片,所以熊猫更容易理解你在做什么。@JoséLuisMartínez。。。如果这回答了你的问题。