列名不同的DataFrame拼接及CSV读取分词错误解决咨询
解决CSV读取报错与多列不一致DataFrame拼接问题
一、先搞定Error tokenizing data的CSV读取问题
这个报错说白了就是你的CSV文件格式乱了——第4行本来应该和表头字段数一致,但实际读出了更多字段,大概率是某行的分隔符用错了,或者有未闭合的引号、换行符搞乱了格式。给你几个靠谱的解决办法:
- 跳过错误行+确认分隔符:如果只是个别行有问题,直接用
on_bad_lines='skip'跳过就行,同时确认你的CSV确实是用逗号分隔的(有时候会不小心用制表符\t,这时候要改成sep='\t'):df = pd.read_csv(csvfile, sep=',', encoding='utf-8', on_bad_lines='skip') - 换用Python引擎处理:pandas默认的C引擎速度快但容错差,换成Python引擎能处理更多格式问题,配合跳过错误行效果更好:
df = pd.read_csv(csvfile, sep=',', encoding='utf-8', engine='python', on_bad_lines='skip') - 手动检查CSV文件:如果允许的话,直接打开CSV看看第4行的内容,是不是有未闭合的引号(比如某字段里的逗号没加引号包裹),手动修正后再读取最稳妥。
二、处理不同列的DataFrame拼接问题
你提到df1有Apple、Banana列,df2多了个Carrot列,拼接其实很简单,但你的现有代码有个明显错误:pd.concat(df)完全没必要——df本身就是DataFrame,pd.concat需要的是DataFrame的列表,不是单个DataFrame。
正确的拼接代码示例:
import pandas as pd import os # 先收集所有要拼接的DataFrame到列表里 df_list = [] # 假设你有多个CSV文件,替换成你的实际文件路径列表 target_csvs = ["df1.csv", "df2.csv"] for csv_path in target_csvs: if os.path.exists(csv_path): # 先解决上面的CSV读取问题,读取单个DataFrame single_df = pd.read_csv(csv_path, sep=',', encoding='utf-8', on_bad_lines='skip') # 直接把单个DataFrame加到列表里,别搞pd.concat(df)! df_list.append(single_df) # 最后一次性拼接所有DataFrame,ignore_index=True重置索引避免重复 result_df = pd.concat(df_list, ignore_index=True)
补充:处理缺失列的填充
拼接后,df1没有的Carrot列会自动填充NaN,如果需要给这些缺失值设默认值(比如0或者空字符串),直接加个fillna就行:
# 用0填充所有缺失值 result_df = pd.concat(df_list, ignore_index=True).fillna(0) # 或者用空字符串填充 result_df = pd.concat(df_list, ignore_index=True).fillna("")
内容的提问来源于stack exchange,提问作者Sun
相关产品推荐
相关产品推荐

