Python 切片多索引的两个不同级别时出错
我在尝试分割多索引的两个级别时收到一条意外的错误消息…关于如何操作有什么帮助吗?请看附件中的代码 我正在运行Python 3.7.1和Pandas 0.23.4 我有这个数据框: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
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。。。如果这回答了你的问题。