循环合并列名重叠且需按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
相关产品推荐
相关产品推荐

