我有一个关于多列索引的一般问题。我想将名称第二级索引(nm)更改为&#ns; ns1'和&#ns; ns2'。看看下面我的df。
Out[13]:
key nm 0 1 2 3
bar abc -0.424972 0.567020 0.276232 -1.087401
dse -0.673690 0.113648 -1.478427 0.524988
baz cws 0.404705 0.577046 -1.715002 -1.039268
cwd -0.370647 -1.157892 -1.344312 0.844885
foo efw 1.075770 -0.109050 1.643563 -1.469388
vqx 0.357021 -0.674600 -1.776904 -0.968914
qux zxe -1.294524 0.413738 0.276662 -0.472035
res -0.013960 -0.362543 -0.006154 -0.923061
Out[13]:
key nm 0 1 2 3
bar ns1 -0.424972 0.567020 0.276232 -1.087401
ns2 -0.673690 0.113648 -1.478427 0.524988
baz ns1 0.404705 0.577046 -1.715002 -1.039268
ns2 -0.370647 -1.157892 -1.344312 0.844885
foo ns1 1.075770 -0.109050 1.643563 -1.469388
ns2 0.357021 -0.674600 -1.776904 -0.968914
qux ns1 -1.294524 0.413738 0.276662 -0.472035
ns2 -0.013960 -0.362543 -0.006154 -0.923061
注意到第二级索引名称已从所有随机字符串更改为&#ns; ns1'和&#ns; ns2'。是否有改变这种方式的pythonic方法?我的原始数据帧非常大,因此很难手动完成。谢谢!
答案 0 :(得分:4)
按MultiIndex.from_product
创建新MultiIndex
并分配回来:
df.index = pd.MultiIndex.from_product([df.index.levels[0], ['ns1','ns2']],
names=df.index.names)
print (df)
0 1 2 3
key nm
bar ns1 -0.424972 0.567020 0.276232 -1.087401
ns2 -0.673690 0.113648 -1.478427 0.524988
baz ns1 0.404705 0.577046 -1.715002 -1.039268
ns2 -0.370647 -1.157892 -1.344312 0.844885
foo ns1 1.075770 -0.109050 1.643563 -1.469388
ns2 0.357021 -0.674600 -1.776904 -0.968914
qux ns1 -1.294524 0.413738 0.276662 -0.472035
ns2 -0.013960 -0.362543 -0.006154 -0.923061
与set_index
类似的解决方案:
df = df.set_index(pd.MultiIndex.from_product([df.index.levels[0], ['ns1','ns2']],
names=df.index.names))
print (df)
0 1 2 3
key nm
bar ns1 -0.424972 0.567020 0.276232 -1.087401
ns2 -0.673690 0.113648 -1.478427 0.524988
baz ns1 0.404705 0.577046 -1.715002 -1.039268
ns2 -0.370647 -1.157892 -1.344312 0.844885
foo ns1 1.075770 -0.109050 1.643563 -1.469388
ns2 0.357021 -0.674600 -1.776904 -0.968914
qux ns1 -1.294524 0.413738 0.276662 -0.472035
ns2 -0.013960 -0.362543 -0.006154 -0.923061