嗨,这是一个我不明白的行为的例子。 以下是列
中的多索引示例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(以前是一种非常优雅的存储多维数据的方式),这一点变得更加相关了。
答案 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'])