You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含多级列索引的DataFrame堆叠至行索引的外层级别

如何将含多级列索引的DataFrame堆叠至行索引的外层级别

嗨,我完全懂你的需求啦——就是想把列多级索引的外层标签直接变成行索引的最外层级别,而不是像默认stack那样放到行索引的内层,对吧?你现在用xs加concat的方法虽然能实现,但确实有点繁琐,其实pandas里有更简洁的 idiom 可以一步到位,给你分享两种常用的思路:

方法一:swaplevel + sort_index 组合(最简洁)

这应该是最符合pandas风格的做法了,只需要在你现有的stack操作之后,调整行索引的级别顺序再排序就行:

df_final = df_init.stack(level=0).swaplevel(0, 1).sort_index(level=0)

给你拆解下步骤:

  1. df_init.stack(level=0):把列索引的外层(A/B/C)堆叠到行索引的内层,得到你示例里的df1;
  2. swaplevel(0, 1):交换行索引的两个级别,让原本在第二层的A/B/C变成行索引的外层,原来的行索引(0-9)变成内层;
  3. sort_index(level=0):按照外层索引(A/B/C)排序,把同一分组的行全部集中到一起,完全匹配你要的df_final结构。

你可以用pd.testing.assert_frame_equal(df_final, 你原来的df_final)验证,结果是完全一致的~

方法二:利用unstack + stack的反向操作

如果你想换个思路,也可以先把列的内层索引转置成行,再重新堆叠外层列索引:

df_final = df_init.unstack(level=1).stack(level=0).unstack(level=1)

不过这个方法绕了点,不如第一种直观,还是更推荐第一种。

为什么不用xs?

你之前用xs的问题在于,当列外层标签很多的时候(比如你实际场景里的16个),要一个个写xs再concat,不仅代码冗余,还容易出错,而上面的方法不管有多少个外层标签,都能一次性处理,非常高效。

备注:内容来源于stack exchange,提问作者user27243451

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:59:51