Python 使用多个参数并行化groupby

Python 使用多个参数并行化groupby,python,pandas,Python,Pandas,我在并行groupby上发现了这个。然而,它不能一对一地转化为有多个参数的情况——除非我弄错了 下面的方法正确吗?有更好的办法吗?(尤其是获取索引似乎效率很低) 使用applyParallel(df.groupby(foo)、someFunc、someArgs)调用哪一个呢?首先要注意的是,除非您的数据相当大,否则您可能看不到并行化带来多少(或任何)好处 与其直接使用多处理池,现在最简单的方法是尝试——它提供了一个类似熊猫的api,主要是为您管理并行性 df = pd.DataFrame(np.

我在并行groupby上发现了这个。然而,它不能一对一地转化为有多个参数的情况——除非我弄错了

下面的方法正确吗?有更好的办法吗?(尤其是获取索引似乎效率很低)


使用
applyParallel(df.groupby(foo)、someFunc、someArgs)调用哪一个呢?

首先要注意的是,除非您的数据相当大,否则您可能看不到并行化带来多少(或任何)好处

与其直接使用多处理池,现在最简单的方法是尝试——它提供了一个类似熊猫的api,主要是为您管理并行性

df = pd.DataFrame(np.random.randn(10000000, 10), columns=list('qwertyuiop'))

df['key'] = np.random.randint(0, 100, size=len(df))

import dask.dataframe as dd

# want a partition size small enough to easily fit into memory
# but large enough to make the overhead worth it
ddf = dd.from_pandas(df, npartitions=4)

%timeit df.groupby('key').sum()
1 loop, best of 3: 1.05 s per loop

# calculated in parallel on the 4 partitions
%timeit ddf.groupby('key').sum().compute()
1 loop, best of 3: 695 ms per loop
请注意,默认情况下,dask对数据帧使用基于线程的调度程序,这对于释放GIL的函数(如
sum
)来说速度更快。如果您正在应用自定义python函数(需要GIL),您可能会看到多处理调度的性能更好

dask.set_options(get=dask.multiprocessing.get)

您可以使用以下版本。Python functool提供了部分函数,可以帮助您实现这一点

from functools import partial

def applyParallel(dfGrouped, func, *args):
     p=Pool(cpu_count())
     result=p.map(partial(func, *args), [group for name, group in dfGrouped])
     p.close()
from functools import partial

def applyParallel(dfGrouped, func, *args):
     p=Pool(cpu_count())
     result=p.map(partial(func, *args), [group for name, group in dfGrouped])
     p.close()