熊猫组慢了,如何优化它

时间:2017-09-18 16:52:59

标签: python r pandas python-3.6

我有以下表格,包含518562条记录和11列

表A

------------------------------------------- 
X (datetime object)| Y (String Object)| Z  ..
-------------------------------------------
2016-11-29 14:32:26| 30123891912AI    | 1  ..

.....

我想按Y分组,并从表中找到最新的条目

我有以下代码正在执行

tableA.groupby("Y", as_index=False).apply(lambda g: g[g["X"] == g["X"].max()]).reset_index(drop=True)

计算需要大约208秒。

我有类似的R代码,大约需要35秒,如下所示:

tableA %>% group_by(Y) %>% filter(X == max(X))  

您知道如何优化代码

2 个答案:

答案 0 :(得分:2)

python中,如果您需要切片最大行,则可以摆脱groupby

df.sort_values(['Y','X']).drop_duplicates(['Y'],keep='last')

idx = df.groupby(['Y'])['X'].transform(max) == df['X']
df[idx]

在你R代码中

tableA %>% group_by(Y) %>% slice(which.max(X)) 

df=df[order(df$Y,df$X),]
df[!duplicated(df$Y,fromLast = T),]

答案 1 :(得分:0)

您也可以使用R中的data.table执行此操作,这可能是最快的。

require(data.table)

setDT(df1)

df[,max(X), keyby = .(Y)] 

使用简单的虚拟数据(n = 500k):

df1 <- data.table(a=sample(1:10,500000,replace=T),b=sample(1:5,500000,replace=T))

system.time(df1[,max(b),keyby=.(a)])

   user  system elapsed 
   0.02    0.00    0.01

dplyr相比:

system.time(df1 %>% group_by(a) %>% slice(which.max(b)))
   user  system elapsed 
   0.06    0.00    0.26