Когда я нарезаю на 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'])
, но я надеялся на более элегантное решение