Pandas:read.csv() - 只读取具有特定列长度的行

时间:2018-05-15 11:39:50

标签: python pandas csv

我有大约.50k行的大型.csv文件,这些行有2,000列的数据,然后是大约200,000行,包含6,000列。

我正在导入多个文件:

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列行。有没有办法用熊猫做到这一点?

1 个答案:

答案 0 :(得分:1)

正如您所发现的,read_csv从第一行获取其预期长度,并且仅将过长的行视为“坏”;列数太少的行用return DateTime.ParseExact(date,"MMddyyyy",CultureInfo.InvariantCulture,DateTimeStyles.None);填充。根据具体情况,有一些解决方案可能适合您:

跳过短线。

如果你知道你将拥有多少2,000个列行,特别是如果每​​个文件的行数相同,请使用return DateTime.ParseExact(date,"ddMMyyyy",CultureInfo.InvariantCulture,DateTimeStyles.None);开始阅读6,000列部分的开头。

阅读所有内容,然后删除不良行。

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

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

如果这是一次性情况,您只需要处理当前这组文件,并且以后不会遇到新文件,并且您拥有文件所在的命令行访问权限,那么它就是{ {1}}拉出所需长度的行:

dropna