如何将同维度、同列名索引名的两个DataFrame合并为含子列的3D新DataFrame
合并同维度DataFrame为带多级列的模拟3D结构
Pandas 没有原生的3D DataFrame,但可以通过**多级列(MultiIndex Columns)**的2D DataFrame实现你需要的效果——让原DataFrame的每一列对应两个子列,分别存储A和B的数据。
方法1:用pd.concat快速合并并调整层级
先构造示例数据(可替换为你自己的DataFrame):
import pandas as pd import numpy as np # 生成同维度、同列名/索引的示例DataFrame A和B np.random.seed(42) A = pd.DataFrame(np.random.rand(3, 2), columns=['col1', 'col2'], index=['row1', 'row2', 'row3']) B = pd.DataFrame(np.random.rand(3, 2), columns=['col1', 'col2'], index=['row1', 'row2', 'row3'])
合并并调整列层级,让原列名作为第一级,A/B作为子列:
# 按列方向合并A和B,用keys标记数据源 combined = pd.concat([A, B], axis=1, keys=['A', 'B']) # 交换列层级顺序,再排序索引让结构更清晰 combined = combined.swaplevel(axis=1).sort_index(axis=1)
最终结果的列结构示例(打印combined):
col1 col2 A B A B row1 0.374540 0.155995 0.950714 0.058084 row2 0.731994 0.866176 0.598658 0.601115 row3 0.156019 0.708073 0.155995 0.020584
方法2:手动构造多级列并赋值
如果想更直观地控制列结构,可以手动创建多级列索引后填充数据:
# 构造多级列:原列名 × 数据源(A/B) multi_cols = pd.MultiIndex.from_product( [A.columns, ['A', 'B']], names=['原始列', '数据源'] ) # 创建空DataFrame,指定索引和多级列 combined_df = pd.DataFrame(index=A.index, columns=multi_cols) # 分别填充A和B的数据 combined_df.loc[:, (slice(None), 'A')] = A.values combined_df.loc[:, (slice(None), 'B')] = B.values
此方法结果与方法1完全一致,逻辑更清晰。
数据访问示例
后续若要访问指定子列数据,比如col1下来自A的数据:
# 简洁写法 combined['col1']['A'] # 更严谨的索引方式 combined.loc[:, ('col1', 'A')]
内容的提问来源于stack exchange,提问作者cursed bunny
相关产品推荐
相关产品推荐

