Можно ли использовать DataFrame.query
с MultiIndex
столбцами?
Рассмотрим следующий кадр данных:
df = pandas.DataFrame(np.arange(81).reshape([9,9]))
df.index = pandas.MultiIndex.from_product([['I','II','III'],['i','ii','iii']],names=("Index0","Index1"))
df.columns = pandas.MultiIndex.from_product([['A','B','C'],['a','b','c']], names=("Col0","Col1"))
print(df)
Col0 A B C
Col1 a b c a b c a b c
Index0 Index1
I i 0 1 2 3 4 5 6 7 8
ii 9 10 11 12 13 14 15 16 17
iii 18 19 20 21 22 23 24 25 26
II i 27 28 29 30 31 32 33 34 35
ii 36 37 38 39 40 41 42 43 44
iii 45 46 47 48 49 50 51 52 53
III i 54 55 56 57 58 59 60 61 62
ii 63 64 65 66 67 68 69 70 71
iii 72 73 74 75 76 77 78 79 80
Уже есть несколько вопросов SO, которые Ответьте, как извлечь подмножества фрейма данных с помощью секционирования и логического индексирования. Так, например, если я хотел бы
(1) Выбрать все строки с помощью Aa <50 </h3> df.loc[df.A.a<50]
Col0 A B C
Col1 a b c a b c a b c
Index0 Index1
I i 0 1 2 3 4 5 6 7 8
ii 9 10 11 12 13 14 15 16 17
iii 18 19 20 21 22 23 24 25 26
II i 27 28 29 30 31 32 33 34 35
ii 36 37 38 39 40 41 42 43 44
iii 45 46 47 48 49 50 51 52 53
(2) Выбрать все строки, где * .b кратно 10
Почти наверняка есть лучший способ написать это, но это работает:
df.loc[(df.xs('b',axis=1,level=1)%10==0).any(axis=1)]
Col0 A B C
Col1 a b c a b c a b c
Index0 Index1
I ii 9 10 11 12 13 14 15 16 17
II ii 36 37 38 39 40 41 42 43 44
III ii 63 64 65 66 67 68 69 70 71
Можно ли выполнять вырезки, как описано выше, используя only оператор query
?
Например, для (1) я могу получить на полпути с
df.A.query('a < 50')
Отображаются ли имена столбцов MultiIndex каким-либо образом в пространстве имен query
? Или это все еще просто невозможно?