【问题标题】: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'])

我的问题是如何解释标签输出?以及这个输出是如何从给定的输入中产生的。

【问题讨论】:

    标签: python pandas


    【解决方案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')]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 2016-06-02
        • 1970-01-01
        相关资源
        最近更新 更多