Pandas多层索引交换后合并同层级条目技术问题
解决MultiIndex交换层级后合并相同条目问题
你提到用swaplevel(0,1)(应该是你写的swap是笔误,pandas里的官方方法是swaplevel)只完成了层级交换,但没看到相同条目合并的效果——这是因为swaplevel仅调整层级顺序,不会对索引进行排序,相同的索引值还是分散在不同位置,pandas也就不会合并显示它们。
要实现你想要的相同层级条目合并显示,只需要在交换层级后对索引进行排序,让相同的上层索引值连续排列,pandas就会自动合并展示这些重复的索引条目了。
完整解决方案代码
import pandas as pd # 原数据构建 idx2 = pd.MultiIndex.from_tuples([("A5",6),("A5",1), ("A2",2),("A2",1),("A3",1),("A3",2), ("A4",4),("A4",1), ("A1",1),("A1",2)], names = ['first','second']) df2 = pd.DataFrame({"A":[10, 11, 7, 8, 5,1,2,3,4,5], "B":[21, 5, 32, 4, 6,1,2,3,4,5], "C":[11, 21, 23, 7, 9,1,2,3,4,5], "D":[1, 5, 3, 8, 6,1,2,3,4,5]}, index = idx2) # 交换层级 + 排序索引,实现相同条目合并显示 result = df2.swaplevel(0, 1).sort_index() print(result)
效果说明
执行上述代码后,交换后的上层索引(原second列)中相同的值会被合并显示(比如值为1的索引只会在第一行显示,下方同值的位置会留白),对应的下层索引(原first列)会依次排列,完全符合你期望的合并效果。
如果你的需求不是显示层面的合并,而是需要对相同索引的行进行数据聚合(比如求和、取均值),可以再结合groupby操作,例如:
# 对交换后的相同索引行求和聚合 agg_result = df2.swaplevel(0, 1).groupby(level=[0,1]).sum()
内容的提问来源于stack exchange,提问作者Melendowski
相关产品推荐
相关产品推荐

