使用多个参数并行化groupby

时间:2016-09-25 12:43:41

标签: python pandas

我在并行化groupby时找到了这个question。但是,它不能一对一地翻译成有多个参数的情况 - 除非我弄错了。

以下是正确的做法吗?有没有更好的办法? (特别是索引看起来效率很低)。

db.execSQL("create studentTable "+studentTable+"(Id Integer primary key, Name text, Department text, Marks Integer)");

使用ArticleFormSet = formset_factory(ArticleForm) if request.method == 'POST': formset = ArticleFormSet(request.POST, request.FILES) 调用哪个。

2 个答案:

答案 0 :(得分:2)

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

而不是直接使用多处理池,现在最简单的方法是尝试dask - 它给出了类似熊猫的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)

答案 1 :(得分:0)

您可以使用以下版本。 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()