我想使用多重处理来读取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: []
答案 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解决方案相同的性能,但我认为将其作为替代解决方案与社区共享非常有用。