You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并同列名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

索引colab
0bla13
1blub24

second

索引colab
0bla57
1blub68

默认合并结果

使用pd.merge按col列合并时,默认会为重复列名添加后缀:

pd.merge(left=first, right=second, on=['col'], suffixes=['_first', '_second'])

得到的结果如下:

索引cola_firstb_firsta_secondb_second
0bla1357
1blub2468

需求说明

希望保留原列名,通过多层列索引标识数据来源,最终期望格式如下:

索引colfirstsecond
abab
0bla1357
1blub2468

实现方法

方法一:先设置多层列索引再合并

先为两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:55:19