python - 使用多处理应用多参数函数以生成熊猫列
问题描述
我最近开始multiprocessing
在 pandas 数据框上映射一些复杂的函数时使用。例如,如果我想根据其他列的值创建一个新列,我可以这样做:
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
这比仅使用with快得多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
whichfunction_2
需要比 1 更多的输入?
解决方案
对此可能有一个更清晰的答案,但我通常会执行以下操作:
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)))
您可能必须对输入应用一些额外的格式才能正确执行此操作。
推荐阅读
- data-science - 回归系数解释 - 我们使用了多少?
- java - Presto:连接器“mysql”没有工厂
- python-3.x - Selenium 键切换 Chrome 扩展程序
- c# - UWP 应用程序中的 Xamarin Forms WebView 控件无法加载 url,但 Edge 浏览器和 Android 应用程序可以
- git - 如何找到我之前用来签出远程 repo url 的远程 repo 分支
- generics - $Proxy293 不能在 Spring AOP 中使用 JDK 动态代理转换为 ...service.impl.ext.MyService
- javascript - Input property not updating after event emitter - angular
- node.js - 如何处理flutter中的websocket错误
- html - 带选择的错误引导
- dynamics-crm - Dynamic 365 报告在更新到 V8.2.19 后出现错误