编辑:我发现了错误,我忘了实际返回聚合函数中的数据...糟糕。 无论如何,下面列出了几种方法,我将在这里留作参考。
原件: 我需要在熊猫数据帧上应用一个计算量很大的groupby并进行聚合。
df.groupby(['Col1','Col2'],as_index=False).aggregate(lambda x: list(x))
我不能为此使用Map(或者也许我这样做,我不知道了),因为我需要访问多行数据才能使两列groupby工作。
如预期的那样,使用Pool.map会返回相同的df,因为它逐行传递数据,而不是逐组或至少作为整个块传递数据。
我想要的很简单:
这真的应该不是很难吗?但是每个示例和教程都固定在逐行操作上,这些操作使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 但是,它并没有我希望的那么快, 请注意,我忘记了在返回或仅返回聚合结果之前分配数据变量。这表明不应在下午晚些时候进行编码。