并行处理的 pandas 按组分组

4

我在将分组操作的聚合步骤拆分到多个核心时遇到了一些问题。以下是我现在正在使用的代码,希望可以在几个处理器上应用它:

import pandas as pd
import numpy as np
from multiprocessing import Pool, cpu_count

mydf = pd.DataFrame({'v1':[1,2,3,4]*6,'v2':['a','b','c']*8,'v3':np.arange(20,44)})

我可以应用以下分组操作:(我希望以并行方式执行的步骤)
pd.groupby(mydf,by=['v1','v2']).apply(lambda x: np.percentile(x['v3'],[20,30]))

产生了以下序列:
1   a     [22.4, 23.6]
    b     [26.4, 27.6]
    c     [30.4, 31.6]
2   a     [31.4, 32.6]
    b     [23.4, 24.6]
    c     [27.4, 28.6]

我参考了以下链接:parallel groupby,尝试了以下操作:
def applyParallel(dfGrouped, func):
    with Pool(1) as p:
        ret_list = p.map(func, [group for name, group in dfGrouped])
    return pd.concat(ret_list)

def myfunc(df):
    df['pct1'] = df.loc[:,['v3']].apply(np.percentile,args=([20],))
    df['pct2'] = df.loc[:,['v3']].apply(np.percentile,args=([80],))
    return(df)


grouped = pd.groupby(mydf,by=['v1','v2'])
applyParallel(grouped,myfunc)

但是我正在失去索引结构并出现重复。 我可能可以通过进一步的分组操作解决此问题,但我认为完全避免这种情况也不应该太困难。 有什么建议吗?

1个回答

2

虽然我并不是在寻找答案,但最好使用一个库来处理Pandas数据框的并行操作,而不是手动尝试。

Dask 是一个选项,旨在通过少量代码修改扩展Pandas操作。

另一个选项(但可能更难设置)是 PySpark


2
我尝试使用dask进行分组操作,但是无论我尝试什么都使它变得更慢并增加了内存消耗。 - gerrit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接