Pandas 使用多处理优化groupby agg查询
我有一个包含220万条记录的数据集,带有一个ID和一个时间戳列。我必须按ID对数据集进行分组,并计算最早时间戳和最新时间戳之间的差异(时间戳在ID中排序)。在我的8核16 GB计算机上运行以下操作大约需要20秒:-Pandas 使用多处理优化groupby agg查询,pandas,pandas-groupby,Pandas,Pandas Groupby,我有一个包含220万条记录的数据集,带有一个ID和一个时间戳列。我必须按ID对数据集进行分组,并计算最早时间戳和最新时间戳之间的差异(时间戳在ID中排序)。在我的8核16 GB计算机上运行以下操作大约需要20秒:- df[['ID','time']].groupby('ID').agg({time : lambda x: x.iloc[-1] - x.iloc[0]}).mean() 在尝试使用Dask并行化我的查询时失败了(Dask不能很好地处理agg),我尝试使用mp将我的df分割成块并并
df[['ID','time']].groupby('ID').agg({time : lambda x: x.iloc[-1] - x.iloc[0]}).mean()
在尝试使用Dask并行化我的查询时失败了(Dask不能很好地处理agg),我尝试使用mp将我的df
分割成块并并行应用聚合,但我不知道如何确保具有相同ID的所有行最终都在同一块中。我现在就是这样做的:-
import multiprocessing as mp
import pandas as pd
def get_throughput_time_df(df):
res = df[['ID','time']] \
.groupby('ID') \
.agg({'time' : lambda x: x.iloc[-1] - x.iloc[0]})
return res
def mult(df):
p = mp.Pool(processes = 8)
split = np.array_split(df,8,axis = 0)
df_pool_results = p.map(get_throughput_time_df,split)
p.close()
result = pd.concat(df_pool_results,axis = 0)
return result.mean()
问题:-
1.)如何确保我的数据集被分割成块,以便具有相同ID的所有行最终都位于同一块中
2)有没有更好的方法来做我想做的事情?我认为
agg
中使用的lambda函数可以进一步优化,因为它占用的执行时间最多,但我看不到一种方法。任何帮助都将不胜感激 忘掉多重处理吧。你的极慢的groupby.agg
和lambda可以被删除,取而代之的是groupbymin
和max
(或者第一个,最后一个),它们有快速的cython实现,然后你可以做一个简单的减法,这是矢量化的,非常快。也就是说,你应该能够做一些非常快的事情,比如:df[['ID','time']].groupby('ID')['time'].agg(['first',last']].diff(axis=1).iloc[:,-1].mean()
。链接的最后一位有点傻,但你可以自己拆分。(如果没有排序,请使用最小值和最大值)这对我来说非常有效。谢谢!