如何将含多级列索引的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)
给你拆解下步骤:
df_init.stack(level=0):把列索引的外层(A/B/C)堆叠到行索引的内层,得到你示例里的df1;swaplevel(0, 1):交换行索引的两个级别,让原本在第二层的A/B/C变成行索引的外层,原来的行索引(0-9)变成内层;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
相关产品推荐
相关产品推荐

