Pandas MultiIndex DataFrame的列名 - 奇怪的行为

时间:2017-06-13 12:04:13

标签: python pandas multi-index

我在MultiIndex dataFrames.columns

中观察到一些奇怪的pandas行为

构建MultiIndex数据帧:

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})

生成此dataFrame

      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

使用原始dataFrame的子集创建新变量

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

产生预期的效果:

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

但访问此新dataFrame的列名会产生一些意外的输出:

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')]

任何人都可以解释一下这种行为的原因吗?

1 个答案:

答案 0 :(得分: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]])