如何使用多处理的地图,在熊猫数据框架和创建新的列?



我有一个大约200万条tweet的数据集,我想使用Asari和其他一些人对其进行情感分析。目前,我正在使用应用程序来获取情感并为它们创建新列。为了加快进程,我想使用多处理,但不确定如何去做。

如果没有多处理器,我的代码看起来如下:(产生新的列)

def asa(x):
asari_1=sonar.ping(x)
hug_1=nlp(x)
return asari_1['top_class'], asari_1['classes'][0]['confidence'], asari_1['classes'][1]['confidence'], hug_1[0]["label"], hug_1[0]["score"]
df_split[i][['asar','asar neg','asar pos','hugposneg','hugscore']]=df_split[i].apply(lambda row: asa(row.Tweet),axis='columns',result_type='expand')
#df_split[0]['asar'],df_split[0]['asar neg'],df_split[0]['asar pos'],df_split[0]['hugposneg'],df_split[0]['hug score']=zip(*df_split[0]['Tweet'].map(asa))   map version 

对于多处理器,我尝试了以下方法,但正如您可能猜到的那样,它们返回的错误如'DataFrame'对象没有属性'p'

%%time
if __name__ == '__main__':
with Pool() as p:
j[['asar','asar neg','asar pos','hugposneg','hugscore']]=j.p.apply(lambda row: asa(row.Tweet),axis='columns',result_type='expand')
#        j['asar'],j['asar neg'],j['asar pos'],j['hugposneg'],j['hug score']=p.zip(*j['Tweet'].map(asa))
j

提前感谢您的宝贵时间!

您可以使用swifter包:

pip install swifter

(注意,您可能希望在虚拟环境中使用它,以避免与已安装的依赖项发生版本冲突。)

Swifter作为pandas的插件,允许您重用apply函数:

import swifter
def some_function(data):
return data * 10
data['out'] = data['in'].swifter.apply(some_function)

它将自动找出最有效的方法来并行化函数,无论它是否矢量化(如上面的例子)。

更多的例子可以在GitHub上找到。请注意,该包正在积极开发中,因此API可能会更改。

还需要注意的是,对于字符串列,这不会自动工作。当使用字符串时,Swifter将回退到"简单"的Pandasapply,这将不是并行的。在这种情况下,即使强迫它使用dask也不会产生性能改进,您最好手动拆分数据集并使用multiprocessing并行化。

最新更新