【问题标题】:Subset of Pandas MultiIndex works for whole index but not for specific level?Pandas MultiIndex 的子集适用于整个索引,但不适用于特定级别?
【发布时间】:2020-12-16 10:54:20
【问题描述】:

我遇到了 pd.MultiIndex 的奇怪行为,并试图了解发生了什么。与其说是寻找解决方案,不如说是解释。

假设我有一个 MultiIndexed 数据框:

index0 = pd.Index(['a', 'b', 'c'], name='let')
index1 = pd.Index(['foo', 'bar', 'baz'], name='word')
x = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], index=[index0, index1])

display(x)

        0   1   2
let word            
a   foo 1   2   3
b   bar 4   5   6
c   baz 7   8   9

如果我随后使用 df.loc 获取该数据帧的一个子集:

sub = ['a', 'c']
y = x.loc[sub]
display(y)

        0   1   2
let word            
a   foo 1   2   3
c   baz 7   8   9

到目前为止,一切都很好。现在,查看新数据帧的索引:

display(y.index)

MultiIndex([('a', 'foo'),
            ('c', 'baz')],
           names=['let', 'word'])

这也是有道理的。但是,如果我查看子集数据帧索引的特定级别...

display(y.index.levels[1])

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

突然间我有了原始完整数据框的值,而不是选定的子集!

为什么会这样?

【问题讨论】:

    标签: python pandas dataframe multi-index


    【解决方案1】:

    我们需要在 this 中添加一个特定的函数remove_unused_levels,因为它是类别类型的数据

    y.index.levels[0]
    Index(['a', 'b', 'c'], dtype='object', name='let')
    
    # after add
    y.index=y.index.remove_unused_levels()
    y.index.levels[0]
    Index(['a', 'c'], dtype='object', name='let')
    

    【讨论】:

      【解决方案2】:

      我认为你混淆了levelsget_level_values

      y.index.get_level_values(1)
      # Index(['foo', 'baz'], dtype='object', name='word')
      

      y.index.levels 正如 Ben 在他的回答中提到的,只是所有可能的值(截断之前)。再看一个例子:

      df = pd.DataFrame([[0]], 
                        index=pd.MultiIndex.from_product([[0,1],[0,1,2]]))
      

      所以df 看起来像:

           0
      0 0  0
        1  0
        2  0
      1 0  0
        1  0
        2  0
      

      现在你认为我们会用df.index.levels[1] 得到什么?答案是:

      Int64Index([0, 1, 2], dtype='int64')
      

      由关卡中所有可能的值组成。而df.index.get_level_values(1) 给出:

      Int64Index([0, 1, 2, 0, 1, 2], dtype='int64')
      

      【讨论】:

        猜你喜欢
        • 2019-11-19
        • 2018-09-06
        • 2016-04-07
        • 1970-01-01
        • 2013-12-20
        • 2020-08-07
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多