在工作中实现无限池处理的过程中,在python中,将函数应用于一系列pandas.DataFrame

时间:2019-11-20 14:34:24

标签: python pandas multiprocessing

我将pandas.DataFrame分成了6个形状相似的行:118317,118315,...,以平衡工作并尊重数据的完整性,以便在字段上使用groupby。 / p>

这6个部分存储在pandas.DataFrame中的list中。

要并行应用的功能如下。

def compute_recency (df):
    recency = df.groupby('name').apply(lambda x: x['date'] - x['date'].shift()).fillna(0).reset_index()
    df = df.join(recency.set_index('level_1'), rsuffix= '_f')
    return df

然后我将进程并行化为:

import multiprocessing as mp

cores=mp.cpu_count()

pool = mp.Pool(cores)

df_out = pool.map(compute_recency, list_of_6_dataframes)

pool.close()
pool.join()

问题在于它一直在jupyter实验室的笔记本中进行计算=> [*],虽然我可以在资源监视器中看到CPU现在“空闲”,但我的意思是说它们起初并不是100%

请注意是否使用以下功能:

def func(df):
    return df.shape

它运作良好且速度很快,永恒没有[*]

所以我想问题出在函数compute_recency上,但是我不明白为什么。
你能帮我吗?


Pandas版本:0.23.4
Python版本:3.7.4

1 个答案:

答案 0 :(得分:1)

要在这里查看可能导致问题的原因有些困难。也许由于您使用的是groupby,也许将您的数据分成了from multiprocessing import Pool groups = [x for _, x in df.groupby("name")] def add_new_col(x): x['new'] = x['date'] - x['date'].shift().fillna(0) return x p = Pool() groups = p.map(add_new_col, groups) df = pd.concat(groups, ignore_index=True) p.close() p.join() 创建的组?然后使用多重处理来处理每个组?

p.map
顺便说一句,关于您的原始代码。 pd.concat将返回数据帧列表,而不是数据帧。这就是为什么我使用{{1}}在最后合并结果的原因。