3

考虑任何数据帧df和任何随机列 ['A', 'B', 'C', 'D'] 的以下代码:

df.groupby('A')['B', 'C', 'D'].agg(['mean', 'std', 'count'])

这里所有的聚合函数都作为一个列表一起传递。

这比:

grpd = df.groupby('A')['B', 'C', 'D']
grpd.agg('mean')
grpd.agg('std')
grpd.agg('count')

每个聚合函数分别被调用

这似乎违反直觉,因为我预计 Pandas 会在后台做一些事情以使其更快。

谁能解释为什么?

4

1 回答 1

3

我认为原因是熊猫使用cython 优化代码,如果单独调用,concat为相同的输出添加测试:

np.random.seed(123)
N = 1000000
df = pd.DataFrame(np.random.randint(1000, size=(N, 4)), columns=list('ABCD'))
print (df)

In [176]: %%timeit
     ...: df.groupby('A')['B', 'C', 'D'].agg(['mean', 'std', 'count'])
     ...: 
274 ms ± 7.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [177]: %%timeit
     ...: grpd = df.groupby('A')['B', 'C', 'D']
     ...: a = grpd.agg('mean')
     ...: b = grpd.agg('std')
     ...: c = grpd.agg('count')
     ...: pd.concat([a,b,c], axis=1)
     ...: 
     ...: 
190 ms ± 980 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [178]: %%timeit
     ...: grpd = df.groupby('A')['B', 'C', 'D']
     ...: a = grpd.mean()
     ...: b = grpd.std()
     ...: c = grpd.count()
     ...: pd.concat([a,b,c], axis=1)
     ...: 
     ...: 
191 ms ± 4.33 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
于 2019-12-24T11:32:47.073 回答