如何迭代合并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
相关产品推荐
相关产品推荐

