我有一个如下所示的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"。有没有什么办法可以在保留其他级别的同时重置此标签的标签?
答案 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