使用pandas.io.parsers.read_table更快地读取数据

时间:2014-03-12 19:04:59

标签: python pandas

我正在尝试将一张桌子读成大熊猫。表中的列由(可变数量)空格分隔,文件包含必须跳过的数据表之前和之后的行。该表还可以包含注释。目前我正在使用

data = pandas.io.parsers.read_table(filename, sep='\s+', delim_whitespace=True, 
           skiprows=nstart, skipfooter=nend, names=column_names, 
           comment='#')

其中nstart和nend是表之前和之后的行数,column_names是列的名称。不幸的是,这会在pandas中调用解析器的python implmentation并且非常慢 - 读取~100000行需要2s。这是数据处理的瓶颈(很多文件!),遗憾的是,更改输出格式不是一种选择。

有没有办法让它更快?

通过一些实验,我发现省略skipfooter并明确地从数据表中删除它们的速度提高了6倍,因为pandas可以(我认为)然后使用C解析器:

data = pd.io.parsers.read_table(filename, delim_whitespace=True,               
           skipinitialspace=True, skiprows=nstart, names=column_names,  
           comment='#', error_bad_lines=False)           
data.reset_index(inplace=True, drop=True)                                      
footer = data.index >= data.shape[0] - nend                             
data.drop(data.index[footer], inplace=True)

但是,这需要额外的reset_index调用(因为索引设置为NaN)并发出警告:

DtypeWarning: Columns (1,2,3,4,5,6,7) have mixed types. Specify dtype option on import or set low_memory=False.

如果我设置low_memory = True,则pandas分段错误。使用dtype=numpy.float64(所有数据都是数字)会导致

TypeError: unorderable types: NoneType() > int()

由于页脚行或注释行而导致。如果警告可以被删除,那么这将是一个可接受的解决方案。

0 个答案:

没有答案