Ошибка при разрезании двух разных уровней мультииндекса - PullRequest
0 голосов
/ 27 декабря 2018

Я получаю неожиданное сообщение об ошибке при попытке нарезать два уровня multiIndex ... Любая помощь о том, как это сделать?Пожалуйста, посмотрите на прикрепленный код ...

Я использую 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

Как мне избежать этого сообщения об ошибке и получить результат, который я ищу?Заранее благодарю ...

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Теперь я понял, благодаря ответу @coldspeed, ответ в одну строку, который я ищу, будет:

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

0 голосов
/ 27 декабря 2018

Вам нужно будет передать список кортежей для нарезки по столбцам.

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

Причина, по которой метки для индекса упрощены, заключается в том, что вы нарезаете одинаковые подуровни для каждого уровня.Это не относится к столбцам, поэтому вам нужно будет изложить каждый из них отдельно.

Подробнее о нарезке на основе MultiIndex можно прочитать на Как нарезать или фильтровать уровни MutliIndex DataFrame? .

...