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
相关产品推荐
相关产品推荐

