簡體   English   中英

MultiIndex DataFrame-給定較高級別的索引值,僅獲取較低級別索引的可能值

[英]MultiIndex DataFrame - Getting only the possible values of a lower level index given an upper level index value

當我將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 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'])

當我只取sfirst索引值為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'])

我希望s_fooindex就像不存在更高級別的s一樣起作用,但是我們可以在s_foo.indexlevels屬性中看到a仍然被認為是索引third的潛在值,盡管s_foo僅具有b作為可能的值。

本質上,我想查找的是foo_s所有可能的third值,即b和僅b 現在我做了set(s_foo.reset_index()['third']) ,但我希望有一個更優雅的解決方案

您可以創建s_foo並顯式刪除未使用的級別:

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

重置索引似乎是正確的方法,似乎您不希望它成為索引(得到的結果就是索引的工作方式)。

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

或者如果你想計數

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM