Pandas 使用多处理优化groupby agg查询

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分割成块并并

我有一个包含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
分割成块并并行应用聚合,但我不知道如何确保具有相同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可以被删除,取而代之的是groupby
min
max
(或者第一个,最后一个),它们有快速的cython实现,然后你可以做一个简单的减法,这是矢量化的,非常快。也就是说,你应该能够做一些非常快的事情,比如:
df[['ID','time']].groupby('ID')['time'].agg(['first',last']].diff(axis=1).iloc[:,-1].mean()
。链接的最后一位有点傻,但你可以自己拆分。(如果没有排序,请使用最小值和最大值)这对我来说非常有效。谢谢!