python – 将列标签的级别附加到MultiIndex

我试图在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]])

因此,您可以再次重新构建多索引,或者设置级别值,然后设置标签值,如上所示

点赞