pandas синтаксис для метода запроса со столбцами MultiIndex - PullRequest
0 голосов
/ 20 февраля 2020

Можно ли использовать 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? Или это все еще просто невозможно?

...