嗨,我有一个文件,每行大约有600万个逗号分隔的值
我正在尝试
import pandas as pd
v = pd.read_csv(file_name,
nrows=1, skiprows=3, header=None, verbose=True, dtype=np.float32)
文件为
Name
Tue Nov 6 13:52:15 2018
Description
52.2269,52.2148,52.246,52.361,52.5263,52.7399,52.9738,53.1952,...45.4,
我得到了输出
标记化耗时:0.00毫秒
类型转换耗时:53023.43毫秒
解析器内存清理耗时:212.13毫秒
v摘要显示
1 rows × 6316057 columns
文件读取时间比预期的要长得多,我认为这可能是由于数据位于一行中。我可以做些什么来加快速度,还是需要其他库?
答案 0 :(得分:0)
对于以下情况,一些虚拟数据:
data = np.random.randn(1_000_000)
with open('tmp', 'wt') as f:
f.write('dummy\n')
f.write('dummy\n')
f.write('dummy\n')
for val in data:
f.write(str(val) + ',')
f.write('\n')
通常,pandas解析器针对“长”数据情况进行了优化,而不是像这样的单个非常宽的行。您可以预处理数据,将定界符变为换行符,在我的示例中,这快40倍。
def parse_wide_to_long(f):
from io import StringIO
data = open(f).read().splitlines()[-1]
data = data.replace(',', '\n')
return pd.read_csv(StringIO(data), header=None)
In [33]: %timeit pd.read_csv('tmp', nrows=1, skiprows=3, header=None, dtype=np.float32)
20.6 s ± 2.04 s per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [39]: %timeit parse_wide_to_long('tmp')
484 ms ± 35.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)