首页 > 解决方案 > Pandas MultiIndex 的子集适用于整个索引,但不适用于特定级别?

问题描述

我遇到了奇怪的行为 apd.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')

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

为什么会这样?

标签: pythonpandasdataframemulti-index

解决方案


我们需要为此添加一个特定的函数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')

推荐阅读