2016-06-07 61 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) 
相關問題