在Pandas中使用多处理读取csv文件的最简单方法

时间:2016-04-13 02:00:37

标签: python csv pandas multiprocessing

这是我的问题。
随着一堆.csv文件(或其他文件)。 Pandas是一种简单的方式来阅读它们并保存为Dataframe格式。但是当文件量很大时,我想用多处理来读取文件以节省一些时间。

我的早期尝试

我手动将文件分成不同的路径。分别使用:

os.chdir("./task_1)
files = os.listdir('.')
files.sort()
for file in files:
    filename,extname = os.path.splitext(file)
    if extname == '.csv':
        f = pd.read_csv(file)
        df = (f.VALUE.as_matrix()).reshape(75,90)   

然后将它们组合起来。

如何使用pool运行它们来解决我的问题? 任何建议都会很感激!

4 个答案:

答案 0 :(得分:9)

使用Pool

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()

答案 1 :(得分:3)

dask库不仅可以解决您的问题,还可以解决您的问题。

答案 2 :(得分:1)

如果您不反对使用其他库,则可以使用Graphlab的sframe。这会创建一个类似于数据帧的对象,如果性能是一个大问题,则读取数据的速度非常快。

答案 3 :(得分:1)

我没有 map / map_async 工作, 但设法使用 apply_async

两种可能的方式(我不知道哪一种更好):

  • A)结束时的Concat
  • B)Concat
  • 期间

我从目录中找到 glob 易于列表 fitler 文件

from glob import glob
import pandas as pd
from multiprocessing import Pool

folder = "./task_1/" # note the "/" at the end
file_list = glob(folder+'*.xlsx')

def my_read(filename):
    f = pd.read_csv(filename)
    return (f.VALUE.as_matrix()).reshape(75,90)

#DF_LIST = [] # A) end
DF = pd.DataFrame() # B) during

def DF_LIST_append(result):
    #DF_LIST.append(result) # A) end
    global DF # B) during
    DF = pd.concat([DF,result], ignore_index=True) # B) during

pool = Pool(processes=8)

for file in file_list:
    pool.apply_async(my_read, args = (file,), callback = DF_LIST_append)

pool.close()
pool.join()

#DF = pd.concat(DF_LIST, ignore_index=True) # A) end

print(DF.shape)