多CSV文件导入Pandas DataFrame列数激增问题求助
嘿,我之前也踩过类似的坑!咱们一步步拆解问题根源,再针对性解决:
最可能的元凶:后续文件未指定分隔符sep=';'
这是新手最容易犯的错误——如果你的代码只在第一个文件导入时加了sep=';',后续文件没指定的话,Pandas会自动推断分隔符。要是某个文件里刚好有逗号、空格这类符号,直接就把一行拆成N多列,列数自然就涨到33了!
举个反例,你可能写了这样的代码:
import pandas as pd import os file_path = "/data/luftdaten/5331" all_files = os.listdir(file_path) df_list = [] # 第一个文件正常导入 first_df = pd.read_csv(os.path.join(file_path, all_files[0]), sep=';') df_list.append(first_df) # 后续文件跳过表头,但没指定分隔符! for f in all_files[1:]: temp_df = pd.read_csv(os.path.join(file_path, f), skiprows=1) df_list.append(temp_df) final_df = pd.concat(df_list)
修复方案:所有文件导入时都强制指定sep=';',而且直接复用第一个文件的列名,确保列完全对齐:
for f in all_files[1:]: # skiprows=1跳过原表头,header=None表示无表头,用names指定统一列名 temp_df = pd.read_csv(os.path.join(file_path, f), sep=';', skiprows=1, header=None, names=first_df.columns) df_list.append(temp_df)
其他可能的坑点
1. 部分文件本身列数就不一致
有可能某个CSV文件的结构和第一个不一样——比如多了几列(比如额外的备注字段)、或者少了列。用concat合并时,Pandas会把所有出现过的列都保留,缺失的列填NaN,列数自然就超标了。
验证方法:先遍历所有文件,打印每个文件的列数:
for f in all_files: temp = pd.read_csv(os.path.join(file_path, f), sep=';') print(f"文件 {f} 列数: {len(temp.columns)}")
如果发现某个文件列数不是12,直接打开那个文件看看是不是有格式错误(比如多打了分号、换行符乱了)。
2. 带引号的字段导致拆分错误
有些CSV里的字段会用引号包裹,比如"Berlin;Germany",如果没指定引号处理参数,Pandas会把这个字段里的分号当成分隔符,直接拆成两列。
修复方案:导入时加上quoting参数:
first_df = pd.read_csv(os.path.join(file_path, all_files[0]), sep=';', quoting=pd.QUOTE_ALL)
也可以加上lineterminator='\n'强制指定换行符,避免因为不同系统的换行符(比如Windows的\r\n)导致行拆分异常。
3. 列名大小写/空格不一致
比如第一个文件的列名是"PM2.5",后续文件的是"pm2.5"或者"PM2.5 "(末尾多了空格),Pandas会把这些当成不同的列,合并后列数就变多了。
验证方法:对比列名差异:
first_cols = set(first_df.columns.str.strip().str.lower()) for f in all_files[1:]: temp_cols = set(pd.read_csv(os.path.join(file_path, f), sep=';', nrows=0).columns.str.strip().str.lower()) if temp_cols != first_cols: print(f"文件 {f} 列名不匹配:{temp_cols - first_cols}")
修复方案:统一所有文件的列名格式:
# 先处理第一个文件的列名 first_df.columns = first_df.columns.str.strip().str.lower() # 后续文件直接用处理好的列名 for f in all_files[1:]: temp_df = pd.read_csv(os.path.join(file_path, f), sep=';', skiprows=1, header=None) temp_df.columns = first_df.columns df_list.append(temp_df)
建议你先拿两个文件测试,用上面的方法定位到具体是哪个环节出问题,很快就能搞定!
内容的提问来源于stack exchange,提问作者Watty62

