如何在Pandas中合并同索引列的三个DataFrame并调整多级索引层级
问题:合并Pandas DataFrame并按原索引分组展示多级索引内容
需求描述
将三个索引与列名完全一致的Pandas DataFrame合并,生成保留原索引与列的最终表格,使同一索引对应的各行按DataFrame分组依次展示(需使用多级索引)。
尝试代码
import pandas as pd d1 = {'P1-6': [53, 141, 51], 'P1-12': [64, 127, 56], 'P1-22': [57, 140, 56]} df1 = pd.DataFrame(data=d1, index=['hAT|1', 'hAT|2', 'hAT|3']) d2 = {'P1-6': [9, 21, 80], 'P1-12': [14, 36, 70], 'P1-22': [16, 31, 68]} df2 = pd.DataFrame(data=d2, index=['hAT|1', 'hAT|2', 'hAT|3']) d_sum = {'P1-6': [62, 162, 131], 'P1-12': [78, 163, 126], 'P1-22': [73, 171, 124]} df_sum = pd.DataFrame(data=d_sum, index=['hAT|1', 'hAT|2', 'hAT|3']) final_table = pd.concat([df1, df2, df_sum], keys=['df1', 'df2', 'df_sum'])
当前输出
P1-6 P1-12 P1-22 df1 hAT|1 53 64 57 hAT|2 141 127 140 hAT|3 51 56 56 df2 hAT|1 9 14 16 hAT|2 21 36 31 hAT|3 80 70 68 df_sum hAT|1 62 78 73 hAT|2 162 163 171 hAT|3 131 126 124
期望输出
P1-6 P1-12 P1-22 hAT|1 df1 53 64 57 df2 9 14 16 df_sum 62 78 73 hAT|2 df1 141 127 140 df2 21 36 31 df_sum 162 163 171 hAT|3 df1 51 56 56 df2 80 70 68 df_sum 131 126 124
解决方案
完全可以实现,只需调整多级索引的层级顺序并重新排序即可,以下是两种简单方法:
方法1:合并后交换索引层级并排序
在原代码基础上,对合并后的结果执行索引层级交换和排序:
final_table = pd.concat([df1, df2, df_sum], keys=['df1', 'df2', 'df_sum']) # 交换多级索引的两个层级,再按新索引顺序排序 final_table = final_table.swaplevel(0, 1).sort_index()
方法2:通过添加标识列构建多级索引
先给每个DataFrame添加来源标识列,再合并后设置多级索引并调整顺序:
# 为每个DataFrame添加来源标识 df1['source'] = 'df1' df2['source'] = 'df2' df_sum['source'] = 'df_sum' # 合并后设置多级索引,再交换层级并排序 combined = pd.concat([df1, df2, df_sum]) final_table = combined.set_index(['source'], append=True).swaplevel(0, 1).sort_index()
执行任意一种方法后,都能得到期望的输出格式:同一原索引下按DataFrame分组展示数据。
内容的提问来源于stack exchange,提问作者emor
相关产品推荐
相关产品推荐

