多索引中的标签输出
Posted
技术标签:
【中文标题】多索引中的标签输出【英文标题】:lables output in multiindex 【发布时间】:2021-12-05 09:32:26 【问题描述】:我正在阅读以下位置的多索引/高级索引
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'])
我的问题是如何解释标签输出?以及这个输出是如何从给定的输入中产生的。
【问题讨论】:
【参考方案1】:级别是MultiIndex
的所有可能的唯一值。
labels
映射此级别。
所以对于第一级['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'])
对于删除,可以使用MultiIndex.remove_unused_levels
,0.20.0 版中的新功能:
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')
当我们看到我们可以用labels
子列表分割levels
子列表时,这一点变得更加明显。
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')]
【讨论】:
以上是关于多索引中的标签输出的主要内容,如果未能解决你的问题,请参考以下文章
Pandas 多索引数据框 - 从多索引中的一个索引中选择最大值