pandas group by 比较慢,如何优化
pandas group by slower, how to optimize it
我关注 table 有 518562 条记录和 11 列
table一个
-------------------------------------------
X (datetime object)| Y (String Object)| Z ..
-------------------------------------------
2016-11-29 14:32:26| 30123891912AI | 1 ..
.....
我想按 Y 分组并从 table
中查找最新条目
我有以下代码正在执行此操作
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))
你知道如何优化代码吗
在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),]
您也可以使用 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
我关注 table 有 518562 条记录和 11 列
table一个
-------------------------------------------
X (datetime object)| Y (String Object)| Z ..
-------------------------------------------
2016-11-29 14:32:26| 30123891912AI | 1 ..
.....
我想按 Y 分组并从 table
中查找最新条目我有以下代码正在执行此操作
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))
你知道如何优化代码吗
在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),]
您也可以使用 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