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