使用joblib并行化dataframe itertuples()行上的循环

2024-07-07 07:44:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用itertuples()在数据帧上迭代,这是一种常见的方法:

for row in df.itertuples():
    my_funtion(row) # do something with row

但是,现在我希望像这样使用joblib并行地执行循环(这对我来说非常简单):

num_cores = multiprocessing.cpu_count()
processed_list = Parallel(n_jobs=num_cores)(delayed(my_function(row) for row in df.itertuples()))

但是,我得到了以下错误:

File "/home/anaconda3/envs/pytorch/lib/python3.7/site-packages/joblib/parallel.py", line 885, in call iterator = iter(iterable) TypeError: 'function' object is not iterable

拜托,你知道有什么问题吗


Tags: 数据方法indfformyfunctioniterable
2条回答

在数据帧上迭代不是常见的方法。不要使用itertuples(),而是使用

df.apply(my_function)

熊猫会为你做“多重处理”

我认为dask.org满足了我对这篇文章的需求(遵循@monkut的建议)。这是一个例子:

import dask.dataframe as dd
sd = dd.from_pandas(some_df, npartitions=40)
sr = pd.Series([1,1.8,2.8,3.8,4.8,5.8]) 
['col1','col2','col3','col4','col5']) # this is a meta sample of the ouput to help dask infer output shape
df_out = sd.apply(my_function,axis=1,meta=sr).compute(scheduler='processes')

此解决方案将my_函数应用于整个数据帧的每一行,时间为31秒,以timeit衡量。我能够看到多个ZMQbg Jupyter进程(最多16个)在执行期间运行。我猜这意味着它是并行执行的

替代解决方案:

df_out = df.apply(my_function,axis=1,result_type="expand")

325秒内产生相同的结果。大约慢10倍。使用此解决方案,我看不到顶部有多个正在运行的进程

相关问题 更多 >