如何将多个DataFrame合并为带有多级索引列的DataFrame
合并多个DataFrame为带多级列索引的结果
已知所有DataFrame的foo列值及顺序完全一致,以下是实现目标的具体方法:
基础示例(2个DataFrame)
首先准备测试数据:
import pandas as pd df1 = pd.DataFrame([['a', 2], ['b', 4]], columns=['foo', 'bar']) df2 = pd.DataFrame([['a', 3], ['b', 5]], columns=['foo', 'bar'])
方法一:分步设置多级列索引后合并
- 给第一个DataFrame的所有列添加外层层级名称(如
df1) - 给后续DataFrame仅保留
bar列(因为foo列完全重复),并添加对应外层层级名称 - 横向合并处理后的DataFrame
代码实现:
# 为df1设置多级列索引 df1_multi = df1.set_axis(pd.MultiIndex.from_tuples([('df1', col) for col in df1.columns]), axis=1) # 为df2的bar列设置多级列索引 df2_multi = df2[['bar']].set_axis(pd.MultiIndex.from_tuples([('df2', 'bar')]), axis=1) # 合并得到结果 result = pd.concat([df1_multi, df2_multi], axis=1)
运行后得到的结果与预期完全一致:
df1 df2 foo bar bar 0 a 2 3 1 b 4 5
通用方案(N个DataFrame)
如果有多个DataFrame,可以用字典存储名称与对应DataFrame,批量处理:
# 存储所有DataFrame,键为名称,值为DataFrame对象 dfs_dict = {'df1': df1, 'df2': df2, 'df3': pd.DataFrame([['a',6], ['b',7]], columns=['foo','bar'])} # 初始化结果:取第一个DataFrame的所有列并设置多级索引 first_name, first_df = next(iter(dfs_dict.items())) result = first_df.set_axis(pd.MultiIndex.from_tuples([(first_name, col) for col in first_df.columns]), axis=1) # 遍历剩余DataFrame,仅合并非foo列 for name, df in dfs_dict.items(): if name == first_name: continue # 过滤掉重复的foo列,设置多级索引后合并 df_filtered = df.drop(columns=['foo']) df_filtered_multi = df_filtered.set_axis(pd.MultiIndex.from_tuples([(name, col) for col in df_filtered.columns]), axis=1) result = pd.concat([result, df_filtered_multi], axis=1)
另一种简洁写法
利用索引对齐特性,先将foo设为索引合并,再还原为列并调整层级:
# 将所有DataFrame的foo设为索引 indexed_dfs = [df.set_index('foo') for df in [df1, df2]] # 用concat的keys参数设置外层列层级 temp_result = pd.concat(indexed_dfs, axis=1, keys=['df1', 'df2']) # 还原foo为列,并调整列层级结构 result = temp_result.reset_index() result.columns = pd.MultiIndex.from_tuples([('df1', 'foo')] + list(result.columns[1:]))
内容的提问来源于stack exchange,提问作者ateymour
相关产品推荐
相关产品推荐

