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

多CSV文件导入Pandas DataFrame列数激增问题求助

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

嘿,我之前也踩过类似的坑!咱们一步步拆解问题根源,再针对性解决:

最可能的元凶:后续文件未指定分隔符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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:02:09