并行化熊猫数据框应用

时间:2021-03-24 18:08:58

标签: python-3.x pandas multiprocessing pandas-apply

我有一个非常大的 Pandas 数据框,我需要在其上应用一些功能。整个过程大约需要 10 秒,我想知道我是否可以在 apply 函数上使用并行化来加快这个过程。

在互联网上搜索时,我遇到了这个 answer,我试了一下,因为其他像 pandarallel 对我来说不起作用。

所以,我的代码如下所示:

def getRightNeighbours(row, df):
    ...

def parallelize(data, func, num_of_processes=4):
    data_split = np.array_split(data, num_of_processes)
    pool = Pool(num_of_processes)
    data = pd.concat(pool.map(func, data_split))
    pool.close()
    pool.join()
    return data

def run_on_subset(func, data_subset, full_df):
    return data_subset.apply(func, args=(full_df,), axis=1)

def parallelize_on_rows(data, func, num_of_processes=4):
    return parallelize(data, partial(run_on_subset, func, full_df=data), num_of_processes)

if __name__ == '__main__':
     df['right_neighbour'] = parallelize_on_rows(df, getRightNeighbours)
     df['bottom_neighbour'] = parallelize_on_rows(df, getBottomNeighbours)
     df['top_neighbour'] = parallelize_on_rows(df, getTopNeighbours)
     df['left_neighbour'] = parallelize_on_rows(df, getLeftNeighbours)

(应用的函数必须能够访问完整的数据帧才能运行,这就是我将其作为参数传递的原因)

结果是执行时间超过 40 秒。因此,不但没有改善,反而变得更糟。

我做错了吗?有没有更好的方法来缩短执行时间?

0 个答案:

没有答案