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

Python中pandas合并CSV为DataFrame失败:列数异常问题

解决CSV合并后列数异常的问题

看起来你遇到的核心问题是部分CSV文件的实际格式和你预期的不一致,导致合并后列数从3变成了11。咱们一步步来排查和解决:

第一步:定位异常文件

首先你需要确认选中的5个CSV里,是不是有文件本身就不是3列。可以在循环里添加打印语句,查看每个文件的形状和列名:

import pandas as pd
import os

path = "Compressed Data/"
all_files = os.listdir(path)
random_csv_file = all_files[0:5]
li = []

for filename in random_csv_file:
    df = pd.read_csv(path+filename, index_col=None, header=0)
    # 打印每个文件的关键信息,方便排查
    print(f"文件 {filename}: 行数={df.shape[0]}, 列数={df.shape[1]}, 列名={df.columns.tolist()}")
    li.append(df)

frames = pd.concat(li, axis=0, ignore_index=True, sort=False)
print(f"合并后总形状: {frames.shape}")
frames.to_csv("combined_csv.csv", index=False, encoding='utf-8-sig')

运行这段代码后,你就能一眼看到哪个文件的列数不是3——它就是导致合并后列数异常的元凶。

第二步:针对不同异常情况修复

根据排查出的问题,你可以选择对应的修复方式:

情况1:部分文件有多余列(格式错误)

如果某个文件因为格式问题(比如额外的分隔符)被解析成了11列,你可以强制只保留前3列,确保所有DataFrame结构一致:

# 读取时只取前3列
df = pd.read_csv(path+filename, index_col=None, header=0).iloc[:, :3]

情况2:分隔符不统一

有些CSV可能不是用逗号分隔的(比如制表符\t、分号;),pandas默认用逗号解析,就会把一行拆成多列。这时候可以指定分隔符,或者让pandas自动检测:

# 方式1:指定已知的分隔符(比如制表符)
df = pd.read_csv(path+filename, index_col=None, header=0, sep='\t')

# 方式2:让pandas自动检测分隔符(适合不确定分隔符的情况)
df = pd.read_csv(path+filename, index_col=None, header=0, sep=None, engine='python')

情况3:列名/表头不一致

如果不同文件的表头列名不一样,pd.concat会把所有列名合并,导致列数变多。你可以统一指定列名,确保所有DataFrame的列结构一致:

# 假设你的CSV列名应该是这三个,替换成你实际的列名
expected_columns = ['列1', '列2', '列3']
df = pd.read_csv(path+filename, index_col=None, header=0, names=expected_columns)

额外说明:行数差异的问题

你提到合并5个1316行的文件后,预期行数是6575(但1316*5=6580),这说明其中一个文件少了5行。通过第一步的打印代码,你也能看到每个文件的行数,找到这个异常文件,确认是文件本身的问题还是读取时的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:57:25