如何使用.apply()来使用多处理来处理pandas数据帧?

时间:2017-11-08 16:16:05

标签: python pandas multiprocessing

我有一个我想要并行应用于pandas数据帧的函数

import multiprocessing
from multiprocessing import Pool
from collections import Counter
import numpy as np

def func1():
    # do some operations in serial
    return word_vector_matrix # a numpy ndarray

def get_vector(text):
    vector = np.zeroes(100,)
    for i in range(5):
        vector += word_vector_matrix[text.index(i)]
    return vector

def apply_get_vector(data):
    return data['text_column'].apply(get_vector)


if __name__ == '__main__':

    word_vector_matrix = func1()

    def parallelize_dataframe(data, func):
        num_cores = multiprocessing.cpu_count()
        num_partitions = num_cores # num chunks = num cores
        chunks_dict = {i:np.array_split(data, num_partitions)[i] for i in range(num_partitions)}
        pool = Pool(num_cores)
        word_vectors = np.concatenate(pool.map(func, [chunks_dict[i] for i in chunks_dict]))
        pool.close()
        pool.join()
        return word_vectors

    vectors = parallelize_dataframe(df, apply_get_vector)

问题是我收到错误

>>> NameError: name 'word_vector_matrix' is not defined

我认为这很奇怪,因为我确实在word_vector_matrix中定义了main,但我没有明确地将它作为get_vector函数的参数。通过不在范围内声明变量,我在这里做错了吗?如果有,我该怎么纠正这个?

我确实找到了this question,其中解释了如何将.apply()与多个参数一起使用,我觉得我们需要在这里使用,但我的情况略有不同,因为我使用multiprocessing 。如果有人能解释如何做到这一点我会非常感激。感谢

0 个答案:

没有答案