Нарезка с мультииндексом с пандами - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь нарезать, используя Multindexing по обеим осям одновременно, но я получаю исключение:

multi_index_0 = pd.MultiIndex.from_product([['A', 'B', 'C'], ['a' , 'b']], names=['first', 'second'])
multi_index_1 = pd.MultiIndex.from_product([['D', 'E'], ['c' , 'd']], names=['first', 'second'])
df = pd.DataFrame(np.random.randn(6, 4), multi_index_0, multi_index_1)

Теперь я хочу нарезать строки ['A', 'b] и [' B ','a'] и столбцы ['D', 'c'] и ['E', 'd'].

Я безуспешно пытался выполнить следующее:

df.loc[['A', 'b'], ['B', 'a']], [['D', 'c'], ['E', 'd']]

повторные обращенияпустой фрейм данных

df.loc[['A', 'B'], ['b', 'a']], [['D', 'E'], ['c', 'd']]

возвращает пустой фрейм данных

df.loc[([['A', 'B'], ['b', 'a']]), ([['D', 'E'], ['c', 'd']])]

TypeError: '['A', 'B']' is an invalid key

df.loc[([['A', 'b'], ['B', 'a']]), ([['D', 'c'], ['E', 'd']])]

TypeError: '['A', 'b']' is an invalid key

Ваш совет будет принят.

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Как ни глупо, мультииндексирование работает с кортежами, но не со списками ... (вероятно, по веским причинам, чтобы избежать двусмысленности в крайних случаях, о которых я не могу сказать прямо на месте).Таким образом, вы можете просто сделать:

df.loc[[('A','b'),('B','a')], [('D', 'c'), ('E', 'd')]]

Конечно, решение Jezrael тоже работает, я просто считаю, что это немного более элегантно (и, возможно, быстрее).

[EDIT]: ВашПервая команда df.loc[['A', 'b'], ['B', 'a']], [['D', 'c'], ['E', 'd']] возвращает пустой DataFrame, потому что вы пропустили скобки, поэтому фактически вы делаете df.loc[['A', 'b'], ['B', 'a']] (плюс список сбоку, поэтому ответом будет кортеж из пустого списка df +).Это для Панд означает: пожалуйста, дайте мне все элементы так, чтобы одновременно:

  • Иметь индекс, начинающийся с A или с b
  • Иметьстолбец, который начинается с B или с.

Поскольку такого столбца нет, вы получите пустой кадр.

Возможно, вы имели в виду: df.loc[[['A', 'b'], ['B', 'a']], [['D', 'c'], ['E', 'd']]], это, однако, дает исключение, потому что, опять же, вы используете списки вместо кортежей.

0 голосов
/ 13 июня 2018

Используйте Index.isin для логической маски, а затем выберите loc:

m1 = df.index.isin((['A', 'b'], ['B', 'a']))
m2 = df.columns.isin((['D', 'c'], ['E', 'd']))

df = df.loc[m1, m2]
print (df)
first                D         E
second               c         d
first second                    
A     b      -0.915119 -0.038221
B     a      -1.224615 -0.873551
...