多索引中的标签输出

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_levels0.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 自定义排序行

Pandas 多索引数据框 - 从多索引中的一个索引中选择最大值

从隐藏在多索引中的年月创建日期时间

熊猫数据框检查索引是不是存在于多索引中

将 numpy 数组复制到 Panda 多索引中(大小相同)

在多索引中移动时间以合并