2017-05-10 13 views
2

你好這裏是我不理解行爲的一個例子。 這裏是多指標的列的例子大熊貓多指標列方式選擇返回所有列,而不是子集

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... 

而且更重要的是任何速戰速決,所以我只能返回相關的數據?

爲大熊貓自嘲面板(這曾經是存儲多維數據非常優雅的方式)

回答

2

在新的大熊貓版本這是由更爲相關(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

+0

哇。這是新版本中的一個很好的發現。 +1 –

+0

@ScottBoston - 確實如此。謝謝。 – jezrael

+0

非常感謝。這是一種非常奇怪的行爲,因爲它對一個或多個行爲並不一樣。 –