Pandas中如何用列替换MultiIndex DataFrame的某层索引
问题场景
我有一个如下所示的MultiIndex DataFrame:
multiindex = pd.MultiIndex.from_arrays( [list('aaaaasssssddddd'), [*range(3, 8), *range(1, 6), *range(2, 7)]], names=['contract', 'index'] ) df = pd.DataFrame(np.random.randn(15, 3), index=multiindex, columns=list('zxc')) print(df)
输出内容:
z x c contract index a 3 0.354879 0.206557 0.308081 4 0.822102 -0.425685 1.973288 5 -0.801313 -2.101411 -0.707400 6 -0.740651 -0.564597 -0.975532 7 -0.310679 0.515918 -1.213565 s 1 -0.175135 0.777495 0.100466 2 2.295485 0.381226 -0.242292 3 -0.753414 1.172924 0.679314 4 -0.029526 -0.020714 1.546317 5 0.250066 -1.673020 -0.773842 d 2 -0.602578 -0.761066 -1.117238 3 -0.935758 0.448322 -2.135439 4 0.808704 -0.604837 -0.319351 5 0.321139 0.584896 -0.055951 6 0.041849 -1.660013 -2.157992
需要将名为index的索引层替换为列c,预期结果如下:
z x contract c a 0.308081 0.354879 0.206557 1.973288 0.822102 -0.425685 -0.707400 -0.801313 -2.101411 -0.975532 -0.740651 -0.564597 -1.213565 -0.310679 0.515918 s 0.100466 -0.175135 0.777495 -0.242292 2.295485 0.381226 0.679314 -0.753414 1.172924 1.546317 -0.029526 -0.020714 -0.773842 0.250066 -1.673020 d -1.117238 -0.602578 -0.761066 -2.135439 -0.935758 0.448322 -0.319351 0.808704 -0.604837 -0.055951 0.321139 0.584896 -2.157992 0.041849 -1.660013
当前实现代码:
df.reset_index().set_index(['contract', 'c']).drop(['index'], axis=1)
该方法先后三次操作索引,步骤冗余,需要更简洁优雅的实现方式。
实现方案
最简洁的写法只需要两步链式操作,利用set_index的append参数直接追加索引层,再删除不需要的旧索引层即可,不需要先重置全部索引:
df = df.set_index('c', append=True).droplevel('index')
逻辑说明:
append=True会把c列追加为新的最内层索引,set_index默认会把作为索引的列从普通列中移除,不需要额外drop列- 此时索引为
contract/index/c三层,调用droplevel('index')直接删除不需要的原index层,就得到目标结构
如果想直接修改索引对象,也可以用如下写法,性能和上面的方法基本一致:
df.index = pd.MultiIndex.from_arrays( [df.index.get_level_values('contract'), df['c']], names=['contract', 'c'] ) df = df.drop('c', axis=1)
内容的提问来源于stack exchange,提问作者f1msch
相关产品推荐
相关产品推荐

