为什么group_by - > filter - >在R中汇总比熊猫更快?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (31)

我正在将一些旧代码从R转换为python。在这个过程中,发现大熊猫比R慢一点。有兴趣知道我做的是否有什么问题。

R代码(在我的系统上大约需要2ms):

df = data.frame(col_a = sample(letters[1:3],20,T),
           col_b = sample(1:2,20,T),
             col_c = sample(letters[1:2],20,T),
             col_d = sample(c(4,2),20,T)
             )

microbenchmark::microbenchmark(
a = df %>% 
  group_by(col_a, col_b) %>% 
  summarise(
    a = sum(col_c == 'a'),
    b = sum(col_c == 'b'),
    c = a/b
  ) %>% 
  ungroup()
)

熊猫(我的系统需要10毫秒):

df = pd.DataFrame({
    'col_a': np.random.choice(['a','b','c'],N),
    'col_b': np.random.choice([1,2],N),
    'col_c': np.random.choice(['a', 'b'],N),
    'col_d': np.random.choice(['4', '2'],N),
})
%%timeit 
df1 = df.groupby(['col_a', 'col_b']).agg({
    'col_c':[
        ('a',lambda x: (x=='a').sum()),
        ('b',lambda x: (x=='b').sum())
    ]}).reset_index()
df1['rat'] = df1.col_c.a/df1.col_c.b
提问于
用户回答回答于

这不是技术上的答案,但值得注意的是,在Pandas中有很多不同的方法来完成这个操作,有些方法比其他方法更快。例如,下面的Pandas代码在大约5ms内获取您正在寻找的值(尽管有一些丑陋的MultiIndex列):

df.groupby(['col_a', 'col_b', 'col_c'])\
  .count()\
  .unstack()\
  .assign(rat = lambda x: x.col_d.a/x.col_d.b)

4.96 ms ± 169 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

除了引擎盖加速之外,我认为tidyverse语法与Pandas 的主要速度优势在于,它summarise()将使每个新变量在同一个调用中立即可用,从而避免spread了计数然后计算rat

如果在熊猫中有类似的东西,我不知道。最接近的是或者pipe()使用lambda内部assign()。链中的每个新函数调用都需要时间来执行,因此Pandas最终会变慢。

扫码关注云+社区

领取腾讯云代金券