【问题标题】:Pandas: read.csv() - read only rows with certain column lengthPandas:read.csv() - 只读具有特定列长度的行
【发布时间】:2018-05-15 11:39:50
【问题描述】:

我有大约 50k 行的大型 .csv 文件,其中包含 2000 列的数据,然后是大约 200k 行包含 6000 列的数据。

我正在导入多个文件:

pd.concat((pd.read_csv(f,index_col='Unnamed: 0', error_bad_lines=False) for f in file_list))

这可能会在 6,000 列的第一行产生错误,它预计只有 2,000 列,或者通过添加 error_bad_lines=False 它会跳过所有 6,000 列行。

在这种情况下,我很乐意在必要时丢弃所有 2,000 列行。有没有办法用 pandas 做到这一点?

【问题讨论】:

    标签: python pandas csv


    【解决方案1】:

    如您所见,read_csv 从第一行获取其预期长度,并且仅将过长的行视为“坏”;列太少的行用NA 填充。根据具体情况,有一些可能适合您的解决方案:

    跳过短线。

    如果您知道您将拥有多少 2,000 列行,特别是如果您的每个文件都相同,请使用 skiprows 在 6,000 列部分的开头开始阅读。

    阅读所有内容,然后删除错误的行。

    这需要一些努力,因为正如您所发现的,pandas 使用文件的第一行来确定预期字段的数量;您需要添加一个包含 6,000 列的标题或将具有正确长度的names 传递给read_csv。这将导致您的 2,000 列行被大量 NA 值填充,之后您可以使用具有适当阈值的 dropna 来删除超过 4,000 个 NA 的行。

    事先对文件进行一些预处理

    如果这是一次性情况,您只需要处理当前的一组文件,以后不会遇到新的文件,并且您可以通过命令行访问文件所在的位置,那么它就是 @ 的一行987654328@拉出所需长度的线:

    awk -F, 'NF==6,000" file.csv > fixed_file.csv
    

    【讨论】:

    • 伟大而全面的回复,谢谢。在这种情况下,我将使用#3。
    猜你喜欢
    • 2017-10-10
    • 2010-09-15
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    相关资源
    最近更新 更多