Pandas read_csv - 使用usecols选项运行无法读取

时间:2017-02-03 21:16:11

标签: python csv pandas

我正在尝试使用panda包读取一个大的tsv文件。 tsv是从zip文件中提取的,该文件分别包含标题名称。它不是我写的 - 我从外部源获取此文件(它是点击流数据)。我通过jupyter笔记本在亚马逊虚拟实例上运行。

我的代码如下:

df = pd.read_csv(zf.open(item[:-4]), 
   compression = None, 
   sep = '\t',
   parse_dates = True,
   names = df_headers,
   usecols = columns_to_include,
   error_bad_lines = False)

df_headers是680个字段,它们是在一个特殊的tsv上提供的。 我的问题是我得到了数百种类型的错误:

跳过第158548行:预计有680个字段,见865

跳过第181906行:预计有680个字段,见865

跳过第306190行:预计680个字段,见到689个 跳绳306191:预计680场,见686

跳过第469427行:预计有680个字段,见1191

跳过第604104行:预计有680个字段,见865

然后操作停止,并带有以下Traceback

引发ValueError(' skip_footer不支持迭代')

然后: pandas.parser.TextReader.read中的pandas / parser.pyx(pandas / parser.c:7988)()

pandas.parser.TextReader._read_low_memory中的pandas / parser.pyx(pandas / parser.c:8244)()

pandas.parser.TextReader._read_rows中的pandas / parser.pyx(pandas / parser.c:9261)()

pandas.parser.TextReader._convert_column_data(pandas / parser.c:10190)中的pandas / parser.pyx()

CParserError:指定的列太多:预期为680,找到489

这不是我用这种方式阅读的第一个文件 - 我读了很多文件,通常只有不到10个这样的错误,我可以忽略它们并读取文件。我不知道为什么这次有问题的行的数量如此之大以及读取停止的原因。 我该怎么办?我甚至无法打开tsv因为它们很大,当我尝试其中一个应该能够打开大文件的工具时 - 我无法找到错误的行,就像行号与错误中报告的行号不相似......(即我不能去第158548行,看看那里有什么问题......) 任何帮助将非常感谢!这对我来说非常重要。

编辑: 当我在没有usecols选项的情况下运行read_csv时(我只在大文件的子集上尝试它) - 它成功了。由于某种原因,usecols会导致pandas识别真实列的一些问题...我将pandas版本更新为0.19.2,因为我看到有一些关于usecols选项的错误修复,但现在我有一个更糟糕的问题 - 当我对文件的一个子集运行读取时(使用nrows =),无论使用或不使用usecols,我都得到不同的结果:使用usecols我得到以下错误:

CParserError:标记数据时出错。 C错误:捕获了缓冲区溢出 - 可能是格式错误的输入文件。

现在我甚至不知道在哪一行......

如果我在没有usecols的情况下运行它,我设法读取但是 - 我设法只为数据的子集(~70万行中的200000行)执行 - 当我尝试每次读取200000行时,然后追加创建数据框我收到内存问题错误.....

usecols列的数量大约为100,整列的数量几乎为700.我有几十个这样的文件,每个文件大约有700000行。

1 个答案:

答案 0 :(得分:0)

针对特定情况:当您在没有标题的情况下在熊猫中加载数据框(标记为通过/失败事件的数据框等)时,文件中包含大量列,并且有一些空列,因此将发生过程中出现问题(错误:指定的列过多...)

在这种情况下,请尝试使用:

df = pd.read_csv('file.csv', header=None, low_memory=False)
  

low_memory允许您使用完整的空列甚至按顺序加载所有这些数据。

注释:

  • 考虑作为pd导入的熊猫

  • 在jupyter笔记本的同一目录中考虑文件

  • 具有16GB RAM内存和i5 vPro 2内核的笔记本电脑