这是我的问题。
随着一堆.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
运行它们来解决我的问题?
任何建议都会很感激!
答案 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 。
两种可能的方式(我不知道哪一种更好):
我从目录中找到 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)