2015-04-06 46 views
0

我有一個數據幀,看起來像這樣:一列的重新標記一個層次多指標

Labels  strategy    firm    
buysell   1 2 4 5  1 2 4 5 
2     1 NaN NaN NaN NaN NaN NaN NaN 
3     1 1 NaN NaN  1 2 NaN NaN 
4     3 1 NaN NaN  2 3 NaN NaN 
5    NaN NaN 2 NaN  1 6 3 NaN 
6     1 13 1 NaN  1 13 6 NaN 
7    NaN 17 18 NaN  1 8 11 NaN 
8    NaN 5 16 1 NaN 7 23 2 
9    NaN 1 12 5 NaN NaN 6 5 
10    NaN 1 NaN 2 NaN NaN NaN 1 

爲了把事情說清楚,這個數據幀的列是一個多指標0是標籤「戰略,牢固程度, ...「,1級是買賣分數」1,2​​,4,5「。每個標籤有一組buySS評分。

而不是「1,2,4,5」,我想我的列MultiIndex的第1級是「ss,s,b,sb」。有什麼方法可以重置此標籤的標籤,同時保留其他級別?

回答

0

由於您只更改級別的標籤不改變它的結構,它是有道理使用的buildin set_level方法,而不是全部重新生成索引:

In [18]: 
df.columns.set_levels([df.columns.levels[0], ['a', 'b', 'c', 'd']]) 
print df 
    strategy    firm    
      a b c d  a b c d 
0           
2   1 NaN NaN NaN NaN NaN NaN NaN 
3   1 1 NaN NaN  1 2 NaN NaN 
4   3 1 NaN NaN  2 3 NaN NaN 
5  NaN NaN 2 NaN  1 6 3 NaN 
6   1 13 1 NaN  1 13 6 NaN 
7  NaN 17 18 NaN  1 8 11 NaN 
8  NaN 5 16 1 NaN 7 23 2 
9  NaN 1 12 5 NaN NaN 6 5 
10  NaN 1 NaN 2 NaN NaN NaN 1 
0

沒關係,好​​不容易纔想辦法的自己:

l = ['ss', 's', 'b', 'sb'] 
level0 = df.columns.levels[0][df.columns.labels[0]] 
mult = len(df.columns)/len(l) 
new_multi = pd.MultiIndex.from_arrays([level0, l*mult]) 
df.columns = new_multi 

而且也是一般情況下,假設需要重命名是最高的國家之一(這似乎是永遠真實的在我的具體情況)的水平:

new_levels = [] 
for i in range(len(df.columns.levels) - 1): 
    new_levels.append(df.columns.levels[i][df.columns.labels[i]]) 
l = ['ss', 's', 'b', 'sb'] 
mult = len(df.columns)/len(l) 
new_levels.append(l * mult) 
new_mutli = pd.MultiIndex.from_arrays(newlevels) 
df.columns = new_multi 

不過,我很樂意提供如何使這更優雅的建議。