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

循环合并列名重叠且需按id匹配的多个DataFrame的实现问题

错误原因

你当前的写法是每次循环都在原始df_1上横向追加新列,由于每次循环的df_2列名完全一致,pandas会自动给重复列加_x/_y后缀区分,导致列数随循环次数线性增长,同时非匹配行全为空值,完全不符合纵向扩行的需求。

解决方案

推荐优先使用「先合并所有df_2再单次关联df_1」的方案,性能更高也更易维护:

import pandas as pd

# 1. 把所有循环中的df_2纵向堆叠为总表
df2_total = pd.concat(dataframes, ignore_index=True)

# 2. 单次和df_1做关联匹配
result = df2_total.merge(df_1, left_on="id_2", right_on="id_1", how="left")

# 3. 筛选保留目标列,调整列顺序
result = result[["id_2", "product_id_left", "product_id_right", "qty", "value"]]

# 可选:如果需要实现你示例中同ID仅首行显示字段值的合并效果,设置多级索引即可
result = result.set_index(["id_2", "product_id_left"])

如果必须保留循环逻辑,可采用「每次关联后追加到结果表」的写法:

import pandas as pd

# 初始化空结果表
result = pd.DataFrame(columns=["id_2", "product_id_left", "product_id_right", "qty", "value"])

for df2 in dataframes:
    # 单次关联当前df2和匹配的df_1行
    temp_df = df2.merge(df_1, left_on="id_2", right_on="id_1", how="left")
    # 追加到结果表
    result = pd.concat([result, temp_df[result.columns]], ignore_index=True)

补充说明

你示例中展示的同id_2仅首行显示product_id_left的效果是展示层面的样式,实际存储时每一行都会有完整的字段值,不影响后续计算。如果需要导出Excel时保留合并单元格效果,调用to_excel方法时传入merge_cells=True参数即可。


内容的提问来源于stack exchange,提问作者Jonas Palačionis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:36:04