2017-06-13 64 views
1

我观察到了一些奇怪的行为大熊猫与多指标dataFrames.columns大熊猫多指标数据帧的列名 - 奇怪的行为

建设一个多指标数据帧:

a=[0,.25, .5, .75] 
b=[1, 2, 3, 4] 
c=[5, 6, 7, 8] 
d=[1, 2, 3, 5] 
df=pd.DataFrame(data={('a','a'):a, ('b', 'b'):b, ('c', 'c'):c, ('d', 'd'):d}) 

产生这个数据帧

 a b c d 
     a b c d 
0 0.00 1 5 1 
1 0.25 2 6 2 
2 0.50 3 7 3 
3 0.75 4 8 5 

创建具有原始数据子集的新变量框架

df1=df.copy().loc[:,[('a', 'a'), ('b', 'b')]] 

产生像预期:

 a b 
     a b 
0 0.00 1 
1 0.25 2 
2 0.50 3 

但访问该新数据帧的列名产生一些意想不到的输出:

print df1.columns 

MultiIndex(levels=[[u'a', u'b', u'c', u'd'], [u'a', u'b', u'c', u'd']], 
      labels=[[0, 1], [0, 1]]) 

所以( 'B', 'b')和('C ','c')仍然包含在内。

相反

print df1.columns.tolist() 

收益预期一样:

[('a', 'a'), ('b', 'b')] 

有谁能够解释我这种行为的原因?

回答

3

我觉得你需要MultiIndex.remove_unused_levels什么是0.20.0版本的新功能。

Docs

print (df1.columns) 
MultiIndex(levels=[['a', 'b', 'c', 'd'], ['a', 'b', 'c', 'd']], 
      labels=[[0, 1], [0, 1]]) 

print (df1.columns.remove_unused_levels()) 
MultiIndex(levels=[['a', 'b'], ['a', 'b']], 
      labels=[[0, 1], [0, 1]])