pandas Multiindex列方法选择返回所有列而不是子集

时间:2017-05-10 13:44:52

标签: python pandas multi-index

嗨,这是一个我不明白的行为的例子。 以下是列

中的多索引示例
arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
          ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])

df = pd.DataFrame(np.random.randn(3, 8), index=['A', 'B', 'C'], columns=index)

现在我想在第一级选择df的子集并返回相关列:

df.loc[:, ['bar']].columns

返回

MultiIndex(levels=[['bar'], ['one', 'two']],
           labels=[[0, 0], [0, 1]],
           names=['first', 'second'])

df.loc[:, ['bar', 'baz']].columns

返回

MultiIndex(levels=[['bar', 'baz', 'foo', 'qux'], ['one', 'two']],
           labels=[[0, 0, 1, 1], [0, 1, 0, 1]],
           names=['first', 'second'])

为什么第二个将返回所有列名而不是

的任何原因
MultiIndex(levels=[['bar', 'baz'], ['one', 'two']] etc...

更重要的是,任何快速修复,以便我只能返回相关数据?

随着pandas弃用Panels(以前是一种非常优雅的存储多维数据的方式),这一点变得更加相关了。

1 个答案:

答案 0 :(得分:2)

在新的pandas版本(0.20.1)中,使用MultiIndex.remove_unused_levels

print (df.loc[:, ['bar', 'baz']].columns)
MultiIndex(levels=[['bar', 'baz', 'foo', 'qux'], ['one', 'two']],
           labels=[[0, 0, 1, 1], [0, 1, 0, 1]],
           names=['first', 'second'])

print (df.loc[:, ['bar', 'baz']].columns.remove_unused_levels())
MultiIndex(levels=[['bar', 'baz'], ['one', 'two']],
           labels=[[0, 0, 1, 1], [0, 1, 0, 1]],
           names=['first', 'second'])

Advanced shown levels in documentation