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

如何用Python合并两个CSV文件的列并生成新CSV?代码问题排查

解决CSV文件列横向合并问题

问题根源

你当前的核心问题是误用了pd.merge()——这个方法是按共同字段关联两个数据集(比如用id匹配行),但你需要的是直接把两个CSV的列横向拼接在一起。同时你的CSV保存代码也存在错误。

正确实现方案

方法一:用Pandas的concat(推荐,简洁高效)

直接横向拼接两个DataFrame,完全匹配你的需求:

import pandas as pd

def merge_csv():
    # 读取两个CSV文件
    data1 = pd.read_csv('C:/folder/csv1.csv')
    data2 = pd.read_csv('C:/folder/csv2.csv')
    
    # axis=1 指定按列横向拼接
    merged_data = pd.concat([data1, data2], axis=1)
    
    # 打印结果确认
    print(merged_data)
    
    # 保存合并后的CSV,index=False 避免生成多余的索引列
    merged_data.to_csv('C:/folder/merged.csv', index=False)

merge_csv()

方法二:用Python标准库csv(无需依赖Pandas)

如果不想用Pandas,可通过逐行读取合并的方式实现:

import csv

def merge_csv():
    # 读取两个CSV的内容
    with open('C:/folder/csv1.csv', 'r') as f1, open('C:/folder/csv2.csv', 'r') as f2:
        reader1 = csv.reader(f1)
        reader2 = csv.reader(f2)
        
        # 获取表头和数据行
        header1 = next(reader1)
        header2 = next(reader2)
        rows1 = list(reader1)
        rows2 = list(reader2)
        
        # 合并表头与每行数据
        merged_header = header1 + header2
        merged_rows = [row1 + row2 for row1, row2 in zip(rows1, rows2)]
    
    # 写入合并后的CSV
    with open('C:/folder/merged.csv', 'w', newline='') as outfile:
        writer = csv.writer(outfile)
        writer.writerow(merged_header)
        writer.writerows(merged_rows)

merge_csv()

原代码错误说明

  1. pd.merge()误用:你的两个CSV没有共同字段,merge会默认尝试找相同列名做匹配,最终生成的结果不符合横向拼列的需求;
  2. 保存代码问题:
    • 第一个to_csv写法基本正确,但缺少index=False会导致CSV多一列索引;
    • 第二个csv.DictWriter的用法错误:output4是Pandas的DataFrame,不能直接传给writerows,需要先转成字典列表(如merged_data.to_dict('records')),但这种方法完全没必要,不如直接用Pandas的to_csv更简便。

效果验证

用你提供的示例文件:
csv1内容:

id,name
1,abc

csv2内容:

dept,location
cse,xyz

运行代码后生成的merged.csv内容:

id,name,dept,location
1,abc,cse,xyz

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:20:36