【问题标题】:Pandas agg custom function with large number of keys具有大量键的 Pandas agg 自定义函数
【发布时间】:2018-07-18 11:38:20
【问题描述】:

10k 以上的键数确实很慢,这确实很常见。有什么办法可以加快速度吗?

import pandas as pd

n = 10*1000000
ngroup = 10000
m = n//ngroup

d = pd.DataFrame({"a":range(n), "b":list(range(ngroup))*m})

%timeit dagg = d.groupby("b")["a"].agg(["mean","std"]).reset_index()
#700 ms

#custom function
%timeit dagg = d.groupby("b")["a"].agg(lambda x: x.mean()+x.std()).reset_index()
#4.37 s

R 的 data.table 中的比较

require(data.table)

n = 10*1000000
ngroup = 10000
m = n/ngroup
DT = data.table(a = 0:(n-1), b = rep(0:(ngroup-1), m))

system.time({dagg = DT[, .(m = mean(a), s = sd(a)), by = b]})
#0.42 sec

#custom function
f <- function(x)mean(x)+sd(x)
system.time({ dagg = DT[, .(k =f(a)), by = b] })
#0.81 sec

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    如果只达到你所需要的(总和平均值和标准),我认为在 groupby 之外做更有效

    %timeit d.groupby("b")["a"].agg(["mean","std"])
    1 loop, best of 3: 698 ms per loop
    
    
    %timeit d.groupby("b")["a"].agg(["mean","std"]).sum(1)
    1 loop, best of 3: 704 ms per loop
    

    你的:

    %timeit d.groupby("b")["a"].agg(lambda x: x.mean()+x.std())
    1 loop, best of 3: 2.89 s per loop
    

    【讨论】:

    • 很好的答案。您可能希望在调用 sum(1) 之前删除列“b”以匹配 lambda 正在执行的操作。
    • @PaSTE 我认为这里的 b 是索引 :-) 所以我们只将所有平均列和标准列相加
    • @miradulo 抱歉...我找不到...d.groupby("b")["a"].agg(["mean","std"]).sum(1)
    • 当然,IMO 只是认为这不是问题的核心。不过没关系。
    • 我想要所有功能的通用解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 2021-06-29
    • 1970-01-01
    • 2020-12-07
    • 2019-06-08
    • 2018-03-12
    • 2019-08-02
    相关资源
    最近更新 更多