Pandas MultiIndex中的Ghost indices

3

我有以下数据:

arrays = [['bar', 'bar', 'baz', 'baz'],
           ['one', 'two', 'one', 'two']]

tuples = list(zip(*arrays))

index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])

s = pd.Series(np.random.randn(4), index=index)

first  second
bar    one       1.791849
       two       0.334121
baz    one      -0.655277
       two      -1.296491


现在我在索引中进行筛选并删除"one":

t = s[s.index.get_level_values(1) != "one"]

first  second
bar    two       0.334121
baz    two      -1.296491

奇怪的是,“one”仍然出现在索引中(取决于我用来访问索引值的方法):
t.index.levels[1]

Index(['one', 'two'], dtype='object', name='second')

或者:

t.index.get_level_values(1)

Index(['two', 'two'], dtype='object', name='second')

你有什么想法,为什么“one”仍然出现在索引中?
1个回答

4
使用MultiIndex.remove_unused_levels方法。因为默认情况下,过滤后索引不会改变,我猜测这是由于性能原因。
print (t.index.remove_unused_levels())
MultiIndex([('bar', 'two'),
            ('baz', 'two')],
           names=['first', 'second'])

print (t.index.remove_unused_levels().levels[1])
Index(['two'], dtype='object', name='second')

谢谢 jezrael。我认为这意味着 pandas 隐式保存了它已经看到的 df 的一组索引?您可以详细说明一下吗? - Carsten
@Carsten - 我一开始没有错误,然后出现了错误,因此创建了这个函数来解决这个问题。 - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接