我正在尝试将一张桌子读成大熊猫。表中的列由(可变数量)空格分隔,文件包含必须跳过的数据表之前和之后的行。该表还可以包含注释。目前我正在使用
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()
由于页脚行或注释行而导致。如果警告可以被删除,那么这将是一个可接受的解决方案。