2017-05-31 31 views
2

我念叨多指標/提前索引在以下位置標貼輸出多指標

https://pandas.pydata.org/pandas-docs/stable/advanced.html

In [1]: arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], 
    ...:   ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']] 
    ...: 

In [2]: tuples = list(zip(*arrays)) 

In [3]: tuples 
Out[3]: 
[('bar', 'one'), 
('bar', 'two'), 
('baz', 'one'), 
('baz', 'two'), 
('foo', 'one'), 
('foo', 'two'), 
('qux', 'one'), 
('qux', 'two')] 

In [4]: index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second']) 

In [5]: index 
Out[5]: 
MultiIndex(levels=[['bar', 'baz', 'foo', 'qux'], ['one', 'two']], 
      labels=[[0, 0, 1, 1, 2, 2, 3, 3], [0, 1, 0, 1, 0, 1, 0, 1]], 
      names=['first', 'second']) 

我的問題是如何解釋標籤輸出?以及如何從給定的輸入產生這種輸出。

回答

2

級別都是可能的唯一值MultiIndexlabels映射這個級別。

因此,對於第一級['bar', 'baz', 'foo', 'qux']由標籤[0, 0, 1, 1, 2, 2, 3, 3]中定義的位置映射,輸出爲['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']。它適用於所有級別。

如果檢查defined levels是可能的,則不使用某些級別,但所有可能的值存在於levels

所以:

print (index[:4].values) 
[('bar', 'one') ('bar', 'two') ('baz', 'one') ('baz', 'two')] 

print (index[:4]) 
MultiIndex(levels=[['bar', 'baz', 'foo', 'qux'], ['one', 'two']], 
      labels=[[0, 0, 1, 1], [0, 1, 0, 1]], 
      names=['first', 'second']) 

對於版本0.20.0刪除就可以使用MultiIndex.remove_unused_levels新:

print (index[:4].remove_unused_levels()) 
MultiIndex(levels=[['bar', 'baz'], ['one', 'two']], 
      labels=[[0, 0, 1, 1], [0, 1, 0, 1]], 
      names=['first', 'second']) 
2

labels是一個列表的列表,其中每個子列表必須長度相同。這是因爲每個子列表的長度與索引本身的長度相同。每個子列表中的每個成員都是相應levels子列表的位置。

因此,pd.MultiIndex的第一個元素將由每個labels子列表的第一個元素確定。

第一子列表中的第一個元素是0和對應於'bar'。第二個子列表的第一個元素是0,對應於'one'。含義索引的第一個元素是('bar', 'one')

當我們看到我們可以將levels子列表與labels子列表分開時,這會變得更加明顯。

index.levels[0][index.labels[0]] 

Index(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], dtype='object', name='first') 

而且

index.levels[1][index.labels[1]] 

Index(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'], dtype='object', name='second') 

,我們可以壓縮他們共同創造了我們所期望的

list(zip(index.levels[0][index.labels[0]], index.levels[1][index.labels[1]])) 

[('bar', 'one'), 
('bar', 'two'), 
('baz', 'one'), 
('baz', 'two'), 
('foo', 'one'), 
('foo', 'two'), 
('qux', 'one'), 
('qux', 'two')]