合并同列名pd.DataFrame时用列索引名替代后缀名的实现
实现DataFrame合并后的多层列索引格式
原始数据定义
首先定义两个待合并的DataFrame:
import pandas as pd first = pd.DataFrame(data={'col': ['bla', 'blub'], 'a': [1, 2], 'b': [3, 4]}) second = pd.DataFrame(data={'col': ['bla', 'blub'], 'a': [5, 6], 'b': [7, 8]})
对应的表格展示:
first
| 索引 | col | a | b |
|---|---|---|---|
| 0 | bla | 1 | 3 |
| 1 | blub | 2 | 4 |
second
| 索引 | col | a | b |
|---|---|---|---|
| 0 | bla | 5 | 7 |
| 1 | blub | 6 | 8 |
默认合并结果
使用pd.merge按col列合并时,默认会为重复列名添加后缀:
pd.merge(left=first, right=second, on=['col'], suffixes=['_first', '_second'])
得到的结果如下:
| 索引 | col | a_first | b_first | a_second | b_second |
|---|---|---|---|---|---|
| 0 | bla | 1 | 3 | 5 | 7 |
| 1 | blub | 2 | 4 | 6 | 8 |
需求说明
希望保留原列名,通过多层列索引标识数据来源,最终期望格式如下:
| 索引 | col | first | second | ||
|---|---|---|---|---|---|
| a | b | a | b | ||
| 0 | bla | 1 | 3 | 5 | 7 |
| 1 | blub | 2 | 4 | 6 | 8 |
实现方法
方法一:先设置多层列索引再合并
先为两个DataFrame添加顶层列标识,再合并后调整层级顺序:
# 将col设为索引,为first的列添加顶层标识'first' first_leveled = first.set_index('col').rename_axis(columns='first') # 为second的列添加顶层标识'second' second_leveled = second.set_index('col').rename_axis(columns='second') # 按索引合并,再将col恢复为普通列 result = pd.concat([first_leveled, second_leveled], axis=1).reset_index() # 调整列层级顺序,让col列处于最外层首位 result.columns = result.columns.reorder_levels([1, 0]) result = result.sort_index(axis=1)
方法二:从默认合并结果重塑列索引
如果已经得到带后缀的合并结果,可通过拆分列名生成多层索引:
# 先执行默认合并 merged_df = pd.merge(left=first, right=second, on=['col'], suffixes=['_first', '_second']) # 拆分列名,构建多层索引元组 col_tuples = [] for col_name in merged_df.columns: if col_name == 'col': col_tuples.append(('', col_name)) else: # 拆分后缀与原列名 original_name, source = col_name.rsplit('_', 1) col_tuples.append((source, original_name)) # 设置多层列索引并排序 merged_df.columns = pd.MultiIndex.from_tuples(col_tuples) merged_df = merged_df.sort_index(axis=1)
内容的提问来源于stack exchange,提问作者PeeteKeesel
相关产品推荐
相关产品推荐

