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

如何迭代合并DataFrame并同步递增重复列后缀?

解决多DataFrame内连接时重复列的命名冲突问题

问题根源

你遇到的MergeError是因为多次使用默认pd.merge合并时,重复列(比如B)会被自动添加_x/_y后缀,当合并第三个及以上DataFrame时,新生成的后缀列名会和已存在的列名重复,导致冲突。

解决方案:先给每个DataFrame的非主键列添加唯一后缀

核心思路是在合并前,给每个DataFrame的非主键列添加上该DataFrame在列表中的序号后缀,确保所有列名唯一,之后再执行内连接就不会有命名冲突了。

完整代码示例

from functools import reduce
import pandas as pd

# 你的示例DataFrame
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df2 = pd.DataFrame({'A': [2, 3, 4], 'C': [10, 11, 12], 'B': [4, 5, 6]})
df3 = pd.DataFrame({'A': [3], 'B': [0], 'D': [13]})
df4 = pd.DataFrame({'A': [3, 7], 'B': [9, 1], 'D': [1, 2]})

list_1 = [df1, df2, df3, df4]

# 第一步:给每个DataFrame的非A列添加序号后缀
processed_dfs = []
for idx, df in enumerate(list_1, start=1):
    # 重命名列:主键A保留原名,其他列加上_序号后缀
    col_mapping = {col: f"{col}_{idx}" if col != 'A' else col for col in df.columns}
    processed_dfs.append(df.rename(columns=col_mapping))

# 第二步:用reduce执行内连接
merged_df = reduce(lambda left, right: pd.merge(left, right, on='A', how='inner'), processed_dfs)

print(merged_df)

输出结果

A  B_1  C_2  B_2  B_3  D_3  B_4  D_4
0  3    6   11    5    0   13    9    1

这个结果和你期望的结构一致,所有重复列都带有对应来源DataFrame的递增后缀,且仅保留所有DataFrame共有的主键A=3这一行。

扩展说明

  • 如果你希望仅给重复出现的列添加后缀(而非所有非主键列),可以先统计所有列的出现次数,再针对性重命名,但实现复杂度更高。对于3-20个文件的场景,给所有非主键列加序号后缀的方法更简洁、不易出错。
  • 处理CSV文件时,只需将读取CSV的代码替换示例中的DataFrame定义即可,比如用pd.read_csv("file.csv")循环读取所有文件存入list_1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:55:13