![](/img/trans.png)
[英]Assigning values to Pandas Multiindex DataFrame by index level
[英]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'])
當我只取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'])
我希望s_foo
的index
就像不存在更高級別的s
一樣起作用,但是我們可以在s_foo.index
的levels
屬性中看到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.