在熊猫中以单行6M值打开csv的速度非常慢

时间:2018-11-06 21:29:27

标签: pandas csv

嗨,我有一个文件,每行大约有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

文件读取时间比预期的要长得多,我认为这可能是由于数据位于一行中。我可以做些什么来加快速度,还是需要其他库?

1 个答案:

答案 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)