【问题标题】:pd.read_csv has issues with differing number of columns between csv filespd.read_csv 存在 csv 文件之间列数不同的问题
【发布时间】:2020-07-17 05:03:21
【问题描述】:

我有许多列数不同的 csv 文件。
大多数 csv 文件为 4 列宽,可被读取和连接。
但是,当遇到超过 4 列的文件时,脚本会出错。

我收到以下错误消息:
Error tokenizing data. C error: Expected 4 fields in line 125, saw 8.

如果我重构代码(如下)以包含 error_bad_lines=Falsepd.read_csv
代码完成并输出一个组合 csv,其中仅包含包含 4 列的行。

如何解决此错误并连接所有内容?
没有索引,所以我只需将 csv 信息堆叠在一起即可。

非常感谢

import os
import glob
import pandas as pd


all_filenames = [
   # think this is working correctly with bunch of replies.csv extensions
   i for i in glob.glob('C:\\Users\\tkim1\\Python Scripts\\output\\*\\replies.csv')
] 

print(all_filenames)

# combine all files in the list
combined_csv = pd.concat([
   pd.read_csv(f, error_bad_lines=False) for f in all_filenames
], sort=False)

# export to csv
combined_csv.to_csv("combined_replies.csv", index=False, encoding='utf-8-sig')

【问题讨论】:

    标签: python pandas csv concatenation


    【解决方案1】:

    这里的问题在于 pandas.concat,而不是 pandas.read_csv。 concat 函数不允许您连接具有不同列数的 DataFrame 对象。

    我能想到解决这个问题的唯一方法是找出列数较少的 DataFrame(比具有最大列数的 DataFrame),将每个 DataFrame 中所需的额外列设置为 NaN,然后​​应用 pd.连接。

    # for example, if df1 has 3 columns and df2 has 2 columns, set the third column in df2 
    # to NaN, then apply concat.
    
    import pandas as pd
    import numpy as np
    
    df1 = pd.DataFrame({'0': np.arange(1, 100), 
                        '1': np.arange(100, 1, -1)})
    df2 = pd.DataFrame({'0': np.arange(100, 200), 
                        '1': np.arange(200, 100, -1), 
                        '2': np.arange(400, 500)})
    df2['2'] = np.nan
    df3 = pd.concat([df1, df2])
    

    【讨论】:

    • 刚刚尝试了您的代码。我可以在不添加 np.nan 的情况下使用 index=False 进行连接。已经成立
    猜你喜欢
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多