【问题标题】:pandas group by in parallelpandas group by 并行
【发布时间】:2018-03-05 08:10:35
【问题描述】:

我在跨多个核心拆分分组操作的聚合步骤时遇到了一些问题。我有以下工作代码,并希望将其应用于多个处理器:

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)})

然后我可以应用以下 GroupBy 操作: (我希望并行执行的步骤)

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)

但是我丢失了索引结构并得到了重复。我可能可以通过进一步的分组操作来解决这一步,但我认为完全避免它应该不会太难。有什么建议吗?

【问题讨论】:

    标签: python-3.x pandas parallel-processing pandas-groupby


    【解决方案1】:

    并不是说我仍在寻找答案,但使用处理 pandas DataFrames 并行操作的库可能会更好,而不是尝试手动操作。

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

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

    【讨论】:

    • 我尝试使用 dask 进行 groupby 操作,但我尝试的所有操作都使其变慢并增加了内存消耗。
    猜你喜欢
    • 1970-01-01
    • 2023-01-15
    • 2023-01-13
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    相关资源
    最近更新 更多