多处理组应用python

时间:2017-06-22 10:28:13

标签: python python-2.7 pandas python-multiprocessing

我有两个小组,一个是要处理的行作为组,另一个是要查看的组。

test = pd.DataFrame({'Address1':['123 Cheese Way','234 Cookie Place','345 Pizza Drive','456 Pretzel Junction'],'city':['X','U','X','U']}) 
test2 = pd.DataFrame({'Address1':['123 chese wy','234 kookie Pl','345 Pizzza DR','456 Pretzel Junktion'],'city':['X','U','Z','Y'] , 'ID' : ['1','3','4','8']})

gr1 = test.groupby('city')
gr2 = test2.groupby('city')

目前我正在将我的功能应用于该组的每一行,

gr1.apply(lambda x: custom_func(x.Address1, gr2.get_group(x.name)))

但是,我不知道如何对此进行多处理。请指教。

编辑: - 我尝试使用dask,但我无法将整个数据框传递给dask中的函数 - 因为apply函数存在限制。我尝试在我的gr1(组)上使用dask apply,但由于我在自定义函数中设置了索引,因此dask会抛出一个错误,说"索引器太多"。

这里有Dask,这给了我一个错误 - ' Pandas' object has no attribute 'city'

ddf1 = dd.from_pandas(test, 2)
ddf2 = dd.from_pandas(test2, 2)

dgr1 = ddf1.groupby('city')
dgr2 = ddf2.groupby('city')

meta = pd.DataFrame(columns=['Address1', 'score', 'idx','source_index'])
ddf1.map_partitions(custom_func, x.Address1, dgr2.get_group(x.city).Address1,meta=meta).compute()

1 个答案:

答案 0 :(得分:2)

我在这里提供了另一种使用dask的解决方案,

import pandas as pd
from multiprocessing import Pool
test = pd.DataFrame({'Address1':['123 Cheese Way','234 Cookie Place','345 Pizza Drive','456 Pretzel Junction'],'city':['X','U','X','U']}) 
test2 = pd.DataFrame({'Address1':['123 chese wy','234 kookie Pl','345 Pizzza DR','456 Pretzel Junktion'],'city':['X','U','Z','Y'] , 'ID' : ['1','3','4','8']})

test=test.assign(dataset = 'test')
test2=test2.assign(dataset = 'test2')

newdf=pd.concat([test2,test],keys = ['test2','test'])
gpd=newdf.groupby('city')
def my_func(mygrp):
    test_data=mygrp.loc['test']
    test2_data=mygrp.loc['test2']
    #do something specific
    #if needed print something
    return {'Address':test2_data.Address1.values[0],'ID':test2_data.ID.values[0]} #return some other stuff

mypool=Pool(processes=2)
ret_list=mypool.imap(my_func,(group for name, group in gpd))

pd.DataFrame(ret_list)

返回类似

的内容
    ID  address
0   3   234 kookie Pl
1   1   123 chese wy
2   8   456 Pretzel Junktion
3   4   345 Pizzza DR

PS:在OP的问题中,在一个专门的函数中比较了两个相似的数据集,这里的解决方案使用pandas.concat。根据问题,人们还可以设想pd.merge