我有以下表格,包含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))
您知道如何优化代码
答案 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