将数据框附加到多处理目标函数的列表列表中

时间:2019-08-07 14:01:13

标签: python dataframe multiprocessing

我想使用多重处理来读取csv并将它们添加在一起。在这种情况下,它可以是未排序的。我使用了此代码,但是由于某种原因,显然无法将数据框添加到数据中。我也尝试过data=data.append(tb,ignore_index=True)。我也尝试在函数中使用global data,但仍然没有结果。

files=[]
for x in glob.glob("*.csv"):
    files.append(x)

data = pd.DataFrame()

def opener(file):
    tb=pd.read_csv(file)
    data.append(tb,ignore_index=True)

if __name__ == '__main__':
    p = Pool(8)
    p.map(opener, files)
    p.close()
    p.join()

print(data)

我只能得到

Empty DataFrame 
Columns: [] 
Index: []

2 个答案:

答案 0 :(得分:1)

multiprocessing方法将数据帧作为共享数据结构传递将是一个很大的问题,因为需要对共享结构进行腌制/打包并传递给每个并行运行的Process
取而代之的是,将共享列表作为过程安全的multiprocessing.Manager.list传递以累积数据帧,然后将通过pd.concat调用将其一次连接起来:

顺便说一下,与(pd.concat +多个pd.DataFrame()调用)相比,.append()应该是首选方法。

from multiprocessing import Pool, Manager
import glob
import pandas as pd
from functools import partial

def csv_to_df(lst, fname):
    lst.append(pd.read_csv(fname))


if __name__ == '__main__':
    dfs_list = Manager().list()
    pool = Pool(processes=8)
    files = glob.iglob('*.csv')
    res = pool.map_async(partial(csv_to_df, dfs_list), files)
    res.wait()
    dfs = pd.concat(dfs_list, ignore_index=True)  # the final result
    print(dfs)  

答案 1 :(得分:0)

在尝试了不同的方式之后,我设法以这种方式运行了用于打开csv文件的多处理程序:

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

files = []
for x in glob.glob("*.csv"):
    files.append(x)

def data_pool(file):
    return pd.read_csv(file)

data = None

if __name__ == '__main__':
    p = Pool(4)
    data = pd.concat(p.map(data_pool, files)).reset_index(drop=True)

它具有与@RomanPerekhrest解决方案相同的性能,但我认为将其作为替代解决方案与社区共享非常有用。