2016-06-07 29 views
4

我正在尝试更改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 

我想的第3等级的标签改变为[ '1', '2', '3', '4'],但无法找到的一个干净的方式正在做。

我试过下面给出了16个元素的迭代,所以不是我所需要的。

test.columns = pd.MultiIndex.from_product([['Level1'],['A','B','C','D'],['1','2','3','4']]) 

我发现在开始手动定义每个级别并重新定义了多指标的唯一解决方法

例如,

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

有一个整齐的解决方案?我正在处理大型数据集,因此上述过程非常繁琐。

+0

但这里有一个语义上的区别,在你的初始构造中,第2级的标签是相同的,所以你不能只重命名级别,因为它会再次将所有列设置为同一级别的名称,而后一种方法定义了4级该级别的不同标签值 – EdChum

回答

1

IIUC你需要设置的电平值,然后标签2个步骤:

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

所以,你可以再次重构多指数你已经尝试过或设置的电平值,然后标签值正如我以上

+0

谢谢!我错过的细节是,你必须设置两个级别和标签。我假设这是相同的,如果我已经开始两个级别,并希望插入第三。 – user6435943

+0

如果我的答案解决了你的问题,那么你可以接受它,我的答案的左上角会有一个空的勾号标记 – EdChum

0

或者所示,你可以使用pd.MultiIndex.from_tuples

test = pd.DataFrame(np.random.random((4,4))) 
index_tuples = [('Level1',letter,number) for letter,number in zip(['A','B','C','D'],range(1,4+1))] 
test.columns = pd.MultiIndex.from_tuples(index_tuples) 
相关问题