Pandas MultiIndex DataFrame 的列名 - 奇怪的行为
Pandas Column Names of MultiIndex DataFrame - strange behaviour
我观察到 MultiIndex dataFrames.columns
有一些奇怪的 pandas 行为
构建多索引数据框:
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()
returns 符合预期:
[('a', 'a'), ('b', 'b')]
任何人都可以向我解释这种行为的原因吗?
我想你需要 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]])
我观察到 MultiIndex dataFrames.columns
有一些奇怪的 pandas 行为构建多索引数据框:
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()
returns 符合预期:
[('a', 'a'), ('b', 'b')]
任何人都可以向我解释这种行为的原因吗?
我想你需要 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]])