MultiIndex DataFrame - 在给定上级索引值的情况下,仅获取较低级别索引的可能值

时间:2018-04-25 19:14:54

标签: python pandas

当我通过0级索引值切入MultiIndex DataFrame时,我想知道属于该初始值的可能的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的{​​{1}}看起来像是:

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的{​​{1}}部分时,查找我得到的索引:

first

我希望foo的{​​{1}}表现得好像>>> 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值,即bthird。现在我做foo_s,但我希望有一个更优雅的解决方案

2 个答案:

答案 0 :(得分:1)

您可以创建s_foo并显式删除未使用的级别:

s_foo = s.loc['foo']
s_foo.index = s_foo.index.remove_unused_levels()

答案 1 :(得分:0)

重置索引似乎是正确的方法,似乎你不希望它成为一个索引(你得到的结果就是索引工作的方式)。

PagedList<>

或者如果你想要计数

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