在python熊猫中加快read_csv

时间:2018-07-30 09:19:44

标签: python pandas dataframe

我正在尝试使用Pandas的'read_csv'方法解析一个巨大的csv文件(大约5000万行)。

下面是我正在使用的代码段:

df_chunk = pd.read_csv(db_export_file, delimiter='~!#', engine='python', header=None, keep_default_na=False, na_values=[''], chunksize=10 ** 6, iterator=True)

然后使用pd.concat方法,我得到了用于进一步处理的整套数据框。

相反,一切正常,从该csv文件进行的读取操作几乎需要6分钟来创建数据帧。

我的问题是,是否有其他方法可以使用相同的模块和方法使此过程更快?

下面是作为csv文件显示的示例数据

155487~!#-64721487465~!#A1_NUM~!#1.000 155487~!#-45875722734~!#A32_ENG~!#This is a good facility 458448~!#-14588001153~!#T12_Timing~!#23-02-2015 14:50:30 458448~!#-10741214586~!#Q2_56!#

预先感谢

1 个答案:

答案 0 :(得分:1)

我认为您最好的选择是split the csv

split -l LINES_PER_FILE YOUR.CSV OUTPUT_NAMES

,然后使用多重处理读取所有块。您有一个example here

import os
import pandas as pd 
from multiprocessing import Pool

# wrap your csv importer in a function that can be mapped
def read_csv(filename):
    'converts a filename to a pandas dataframe'
    return pd.read_csv(filename)


def main():
    # set up your pool
    pool = Pool(processes=8) # or whatever your hardware can support

    # get a list of file names
    files = os.listdir('.')
    file_list = [filename for filename in files if filename.split('.')[1]=='csv']

    # have your pool map the file names to dataframes
    df_list = pool.map(read_csv, file_list)

    # reduce the list of dataframes to a single dataframe
    combined_df = pd.concat(df_list, ignore_index=True)

if __name__ == '__main__':
    main()