2017-05-31 28 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')]