我试图在MultiIndex中更改单个级别的列标签.
例如,
test = pd.DataFrame(np.random.random((4,4)))
test.columns = pd.MultiIndex.from_product([['Level1'],['A','B','C','D'],['Level3']])
Out:
Level1
A B C D
Level3 Level3 Level3 Level3
0 0.153388 0.253070 0.338756 0.025598
1 0.818954 0.169352 0.851079 0.823263
2 0.535703 0.432627 0.690446 0.599997
3 0.304654 0.919936 0.095747 0.404449
我想将’Level 3’标签更改为[‘1′,’2′,’3′,’4’],但找不到干净的方法.
我已经尝试了下面的,它提供了16个元素的迭代,所以不是我需要的.
test.columns = pd.MultiIndex.from_product([['Level1'],['A','B','C','D'],['1','2','3','4']])
我发现的唯一解决方法是在开始时手动定义每个级别并重新定义MultiIndex
例如,
level1 = ['Level1','Level1','Level1','Level1']
level2 = ['A','B','C','D']
level3 = ['1','2','3','4']
test = pd.DataFrame(np.random.random((4,4)),columns=[level1,level2,level3])
有更整洁的解决方案吗?我正在使用大型数据集,因此上述内容非常繁琐.
最佳答案 IIUC您需要设置级别值,然后分两步设置标签:
In [153]:
test.columns = test.columns.set_levels(['0','1','2','3'],level=2)
test.columns = test.columns.set_labels([0,1,2,3],level=2)
test
Out[153]:
Level1
A B C D
0 1 2 3
0 0.122865 0.778640 0.582170 0.695648
1 0.051477 0.479084 0.150539 0.143929
2 0.362087 0.285109 0.465092 0.205157
3 0.963744 0.730001 0.148460 0.474678
原因是因为最初你的第三级都有重复列的相同标签(0):
In [155]:
test.columns
Out[155]:
MultiIndex(levels=[['Level1'], ['A', 'B', 'C', 'D'], ['Level3']],
labels=[[0, 0, 0, 0], [0, 1, 2, 3], [0, 0, 0, 0]])
但你想要的是重命名水平和标签,导致以下结果:
In [158]:
test.columns
Out[158]:
MultiIndex(levels=[['Level1'], ['A', 'B', 'C', 'D'], ['0', '1', '2', '3']],
labels=[[0, 0, 0, 0], [0, 1, 2, 3], [0, 1, 2, 3]])
因此,您可以再次重新构建多索引,或者设置级别值,然后设置标签值,如上所示