簡體   English   中英

如何在多個數據框lambda函數上實現dask mappartitions?

[英]How to implement dask mappartitions on multiple dataframe lambda function?

我僅使用熊貓就實現了兩個數據框之間的模糊字符串匹配算法。 我的問題是如何將其轉換為使用多個內核的輕松操作? 我的程序在純python上運行大約3-4天,我想並行化操作以優化時間成本。 我已經使用多處理程序包通過以下代碼提取內核數:

numCores = multiprocessing.cpu_count()

fields = ['id','phase','new']
emb = pd.read_csv('my_csv.csv', skipinitialspace=True, usecols=fields)

然后,我必須根據與每個字符串關聯的數值將數據框emb細分為兩個數據框(emb1,emb2)。 就像我通過匹配的字符串將一個數據幀的所有元素的值都為3的值與另一個數據幀中的對應值2進行匹配一樣.pandas操作的代碼如下。

emb1 = emb[emb.phase.isin([3.0])]
emb1.set_index('id',inplace=True)

emb2 = emb[emb.phase.isin([2.0,1.5])]
emb2.set_index('id',inplace=True)

def fuzzy_match(x, choices, scorer, cutoff):
return process.extractOne(x, choices=choices, scorer=scorer, score_cutoff=cutoff)

FuzzyWuzzyResults = pd.DataFrame(emb1.sort_index().loc[:,'strings'].apply(fuzzy_match, args = (emb2.loc[:,'strings'],fuzz.ratio,90)))

我有點嘗試使用以下代碼來實現一個簡單的實現:

emb1 = dd.from_pandas(emb1, npartitions=numCores)
emb2 = dd.from_pandas(emb2, npartitions=numCores)

但是為兩個數據幀運行lambda函數使我感到困惑。 有任何想法嗎?

因此,我只修復了代碼以刪除數據幀的手動分區,而是使用了groupby。

這是代碼:

for i in [2.0,1.5]:
    FuzzyWuzzyResults = emb.map_partitions(lambda df: df.groupby('phase').get_group(3.0)['drugs'].apply(fuzzy_match, args=(df.groupby('phase').get_group(i)['drugs'],fuzz.ratio,90)), meta=('results')).compute()

不知道它是否准確,但是至少它正在運行,並且在所有CPU內核上也是如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM