MultiIndex DataFrame - получение только возможных значений индекса нижнего уровня при заданном значении индекса верхнего уровня - PullRequest
0 голосов
/ 25 апреля 2018

Когда я нарезаю на MultiIndex DataFrame по значению индекса уровня 0, я хочу знать возможные значения индекса уровня 1+, которые подпадают под это начальное значение.Если моя формулировка не имеет смысла, вот пример:

>>> arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
... ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'],
... ['a','b','a','b','b','b','b','b']]
>>> tuples = list(zip(*arrays))
>>> index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second','third'])
>>> s = pd.Series(np.random.randn(8), index=index)
>>> s
first  second  third
bar    one     a       -0.598684
       two     b        0.351421
baz    one     a       -0.618285
       two     b       -1.175418
foo    one     b       -0.093806
       two     b        1.092197
qux    one     b       -1.515515
       two     b        0.741408
dtype: float64

s * index выглядит так:

>>> s.index
MultiIndex(levels=[[u'bar', u'baz', u'foo', u'qux'], [u'one', u'two'], [u'a', u'b']],
           labels=[[0, 0, 1, 1, 2, 2, 3, 3], [0, 1, 0, 1, 0, 1, 0, 1], [0, 1, 0, 1, 1, 1, 1, 1]],
           names=[u'first', u'second', u'third'])

Когда я беру только часть s, чье значение индекса first равно foo, и посмотрите индекс, который я получаю:

>>> s_foo = s.loc['foo']
>>> s_foo
second  third
one     b       -0.093806
two     b        1.092197
dtype: float64

>>> s_foo.index
MultiIndex(levels=[[u'one', u'two'], [u'a', u'b']],
           labels=[[0, 1], [1, 1]],
           names=[u'second', u'third'])

Я хочу, чтобы index из s_foo действовал так, как если бы более высокий уровеньs не существует, но в атрибуте s_foo.index levels мы можем видеть, что a все еще считается потенциальным значением индекса third, несмотря на то, что s_foo имеет только b каквозможное значение.

По сути, я хочу найти все возможные third значения foo_s, то есть b и только b.Сейчас я делаю set(s_foo.reset_index()['third']), но я надеялся на более элегантное решение

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Вы можете создать s_foo и явно отбросить неиспользуемые уровни:

s_foo = s.loc['foo']
s_foo.index = s_foo.index.remove_unused_levels()
0 голосов
/ 25 апреля 2018

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

s.reset_index(level=2).groupby(level=[0])['third'].unique()

или еслиВы хотите счет

1005 *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...