Как найти столбец, который содержит конкретный вложенный столбец / вложенный столбец в 3D-Pandas Dataframe - PullRequest
0 голосов
/ 23 сентября 2018

Таким образом, у меня есть следующий 3D-кадр данных Pandas, new:

  unique     cat     numerical    
       c   f   b   d         a   e
0      2   5   1   3         0   4
1      8  11   7   9         6  10
2     14  17  13  15        12  16

Я хочу найти, какой «более мелкий» столбец содержит «более глубокий» столбец «d», который будет «кошкой»,Я действительно новичок в Pandas, но после того, как некоторое время смотрю на new.columns:

MultiIndex(levels=[['cat', 'numerical', 'unique'], ['a', 'b', 'c', 'd', 'e', 'f']],
           labels=[[2, 2, 0, 0, 1, 1], [2, 5, 1, 3, 0, 4]])

, я наконец-то понял, что это действительно, казалось бы, многословный, чрезвычайно вложенный, запутанный способ сделать это, что заставляет меня'cat':

print(
    new.columns.levels[0][\
    new.columns.labels[0][\
    pd.Index(new.columns.labels[1]).get_loc(\
    pd.Index(new.columns.levels[1]).get_loc('d'))]]
)

Я в основном получаю позицию 'd' во втором массиве под уровнями (назовем это pos1), затем нахожу позицию (pos2) этого значения (pos1)во втором массиве под метками, а затем найти значение (val1) в первом массиве под «метками», используя эту позицию (pos2), и, наконец, найти, какое имя столбца в первом массиве в «уровнях», используя позицию val1.

Итак, мой вопрос: есть ли лучший, «правильный» способ сделать все это?Спасибо.

PS на отдельном примечании, все это на самом деле просто так, что я могу искать столбец "d", не зная, к какому "пологому" столбцу он принадлежит:

row = (new.loc[new['cat']['d'] == 9])

, так чтоЯ получаю:

  unique     cat     numerical    
       c   f   b   d         a   e
1      8  11   7   9         6  10

Так что, если бы был способ сделать это, весь этот вопрос можно было бы избежать. (Я новичок в переполнении стека, я должен поместить это в новый вопрос или smt)

1 Ответ

0 голосов
/ 23 сентября 2018

swaplevel

Но у вас нет гарантии, что у вас будет уникальный столбец, поэтому я форсирую проблему с помощью iloc[:, 0]

new[new.swaplevel(0, 1, 1).d.iloc[:, 0].eq(9)]

  unique     cat    numerical    
       c   f   b  d         a   e
1      8  11   7  9         6  10

xs

То же предостережение об отсутствии гарантии уникальности

new[new.xs('d', 1, 1).iloc[:, 0].eq(9)]

  unique     cat    numerical    
       c   f   b  d         a   e
1      8  11   7  9         6  10

IndexSlice

new[new.loc[:, pd.IndexSlice[:, 'd']].iloc[:, 0].eq(9)]

  unique     cat    numerical    
       c   f   b  d         a   e
1      8  11   7  9         6  10

levels и labels

Моя версия замысловатого подхода

a0, a1 = new.columns.labels
b0, b1 = new.columns.levels

j = b1.get_loc('d')
i = a0[(a1 == j).argmax()]
t = (b0[i], b1[j])

new[new[t] == 9]

  unique     cat    numerical    
       c   f   b  d         a   e
1      8  11   7  9         6  10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...