我最近开始在pandas数据帧上映射一些复杂函数时使用multiprocessing
。例如,如果我想根据其他列的值创建一个新列,我可以这样做:
import seaborn as sns
iris = sns.load_dataset('iris')
import multiprocessing as mp
#example of a "complex function" returning some array
def function_1(val_):
return [1] * round(val_)
with mp.Pool(mp.cpu_count()) as pool:
iris['test_1'] = pool.map(function_1, iris['petal_length'])
这比仅使用apply
和lambda function
要快得多。
如果我有一个函数,它将数据帧的多个其他列(甚至加上一些参数(作为输入,我通常可以这样应用它:
def function_2(val_1, val_2, param_):
return [param_] * round(val_1 + val_2)
iris['test_2'] = iris.apply(lambda x: function_2(x['petal_length'], x['sepal_width'], 3), axis=1)
如何将multiprocessing
用于需要比1更多输入的function_2
?
对此可能有一个更清晰的答案,但我通常会做以下操作:
import itertools
def function_2(input):
val_1, val_2, param_ = input
return [param_] * round(val_1 + val_2)
iris['test_2'] = pool.map(function_2, zip(iris['petal_length'], iris['sepal_width'], itertools.repeat(3)))
您可能需要对输入应用一些额外的格式才能正确执行。