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

使用pandas.concat合并同结构CSV文件出现列错位问题的技术求助

问题根源:列名不匹配导致的合并异常

你的代码思路本身没问题,但问题出在两个CSV文件的列名不一致上:

  • ex1.csv的第一行被你当作表头(因为用了header=0),所以列名被识别为Ex1和Ex1.1(重名列会自动添加后缀)
  • ex2.csv的第一行同样被当作表头,列名被识别为Ex2和Ex2.1

Pandas的concat会保留所有不同列名的列,不存在对应列的行就用NaN填充,这就是你看到异常结果的原因。


解决方案

根据你的实际场景,有两种针对性的处理方式:

情况1:CSV文件没有表头,第一行就是数据

如果你的两个CSV里所有行都是数据(包括第一行),只是误把第一行当成了表头,那修改读取逻辑,告诉Pandas不要将第一行识别为表头:

import os
import pandas as pd
import glob

joined_files = os.path.join(".", "*.csv")
joined_list = glob.glob(joined_files)
li = []

for filename in joined_list:
    # header=None 表示文件无表头,第一行直接作为数据行
    df = pd.read_csv(filename, index_col=None, header=None, sep=',')
    li.append(df)

frame = pd.concat(li, axis=0, ignore_index=True)
# 如果需要给合并后的文件添加自定义表头,可在保存时指定
frame.to_csv('merged.csv', index=False, header=['Col1', 'Col2'])
print(frame)

这样合并后的结果就会是你预期的所有行依次追加,不会出现NaN。

情况2:CSV确实有表头,但表头文字不同(结构一致)

如果两个CSV确实有表头,只是表头文字不同(但列的含义/结构完全一致),可以统一所有DataFrame的列名后再合并:

import os
import pandas as pd
import glob

joined_files = os.path.join(".", "*.csv")
joined_list = glob.glob(joined_files)
li = []

for filename in joined_list:
    df = pd.read_csv(filename, index_col=None, header=0, sep=',')
    li.append(df)

# 将所有DataFrame的列名统一为第一个文件的列名
for df in li[1:]:
    df.columns = li[0].columns

frame = pd.concat(li, axis=0, ignore_index=True)
frame.to_csv('merged.csv', index=False)
print(frame)

这样合并后的列名会和第一个CSV的表头保持一致,所有行正常追加。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 19:22:33