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

如何基于B列值横向合并同列名的Pandas DataFrame并保留原列名?

解决方案

首先明确:pd.concat不支持指定某一列作为合并依据——它的核心是按索引对齐或直接堆叠(横向/纵向),无法基于特定列的值进行匹配合并。要实现你要的效果,有两种更直接的方法:

方法1:用pd.merge配合列重命名,保留原列名

merge默认会给重复列名加_x/_y后缀,但你可以合并后手动去掉后缀,保留原列名(Pandas允许重复列名):

import pandas as pd

# 构造示例数据
df1 = pd.DataFrame({'A': [1,2,3], 'B': ['x','y','z'], 'C': [4,5,6], 'D': [7,8,9]})
df2 = pd.DataFrame({'A': [10,20,30], 'B': ['y','z','x'], 'C': [40,50,60], 'D': [70,80,90]})

# 基于B列合并,用临时后缀区分重复列
merged = pd.merge(df1, df2, on='B', suffixes=('_tmp1', '_tmp2'))
# 重命名列,去掉临时后缀,恢复原列名(允许重复)
merged.columns = ['A', 'B', 'C', 'D', 'A', 'C', 'D']

方法2:用join(先将B列设为索引)

join是按索引合并的方法,先把两个DataFrame的B列设为索引,合并后再重置索引即可保留原列名:

# 将B列设为索引
df1_idx = df1.set_index('B')
df2_idx = df2.set_index('B')

# 按索引合并(即基于B列的值匹配),支持inner/outer/left/right四种连接方式
joined = df1_idx.join(df2_idx, how='inner')
# 重置索引,把B列放回普通列
joined = joined.reset_index()
# 调整列顺序,还原成你要的A、B、C、D重复结构
joined = joined[['A', 'B', 'C', 'D', 'A', 'C', 'D']]

注意事项

  • Pandas允许重复列名,但访问这类列时,df['A']会返回所有名为A的列;如果要单独访问某一个,需要用位置索引(比如df.iloc[:, 0]取第一个A列)。
  • 如果你的B列存在重复值,两种方法都会自动处理一对多/多对多的匹配,和merge的逻辑一致。

内容的提问来源于stack exchange,提问作者user20505088

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:25:36