我将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
答案 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}}在最后合并结果的原因。