2015-04-06 45 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 

不过,我很乐意提供如何使这更优雅的建议。