通过groupby和聚合操作对熊猫数据框进行简单的并行处理

时间:2019-02-27 16:30:42

标签: python pandas dataframe python-multiprocessing

编辑:我发现了错误,我忘了实际返回聚合函数中的数据...糟糕。 无论如何,下面列出了几种方法,我将在这里留作参考。

原件: 我需要在熊猫数据帧上应用一个计算量很大的groupby并进行聚合。

df.groupby(['Col1','Col2'],as_index=False).aggregate(lambda x: list(x))

我不能为此使用Map(或者也许我这样做,我不知道了),因为我需要访问多行数据才能使两列groupby工作。
如预期的那样,使用Pool.map会返回相同的df,因为它逐行传递数据,而不是逐组或至少作为整个块传递数据。

我想要的很简单:

  • 将数据帧拆分为n个Slices / Chunk(我认为np.array_split对此效果很好),
  • 在每个切片上应用groupby并进行聚合(只是对每个切片进行常规操作)
  • 然后将切片合并在一起(pd.concat)

这真的应该不是很难吗?但是每个示例和教程都固定在逐行操作上,这些操作使groupby / aggregate不起作用。

感谢您的帮助:)

编辑:

我尝试过:

from multiprocessing import Pool
num_partitions = 10 #number of partitions to split dataframe
num_cores = 4 #number of cores on your machine
def parallelize_dataframe(df, func):
    df_split = np.array_split(df, num_partitions)
    pool = Pool(num_cores)
    df = pd.concat(pool.map(func, [group for name,group in df.groupby(['Col1','Col2'])]))
    pool.close()
    pool.join()
    return df
def aggregate_fun(data):
    data = data.groupby(['Col1','Col2'],as_index=False).aggregate(lambda x: list(x))
    return data

EDIT2:

from concurrent.futures import ProcessPoolExecutor, as_completed
ppe = ProcessPoolExecutor(4)

futures = []
results = []
for group in np.split(df, 4):
    p = ppe.submit(aggregate_fun, group)
    futures.append(p)

for future in as_completed(futures):
    r = future.result()
    results.append(r)

df_output = pd.concat(results) 

这两种方法都可以,只要您不忘记让函数实际返回某些东西:P 但是,它并没有我希望的那么快, 请注意,我忘记了在返回或仅返回聚合结果之前分配数据变量。这表明不应在下午晚些时候进行编码。

0 个答案:

没有答案