重新标记Columns MultiIndex的一个级别

时间:2015-04-06 15:23:04

标签: python pandas dataframe

我有一个如下所示的DataFrame:

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

为了清楚起见,这个DataFrame的列是一个MultiIndex,其0级是标签"策略,公司,......"和1级是买卖分数" 1,2,4,5"。每个标签都有一套buysell分数。

而不是" 1,2,4,5",我喜欢我的列MultiIndex的第1级是" ss,s,b,sb"。有没有什么办法可以在保留其他级别的同时重置此标签的标签?

2 个答案:

答案 0 :(得分: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

尽管如此,我仍然愿意接受如何使其更优雅的建议。

答案 1 :(得分: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