Python 为什么在多个列上运行pandas transform比在所有单个列上运行要慢?

Python 为什么在多个列上运行pandas transform比在所有单个列上运行要慢?,python,pandas,Python,Pandas,我按单个列进行分组,然后转换多个数据列。这是可疑的缓慢,当我做它在一个单一的步骤。事实上,这比手动循环每个列进行转换然后组装结果要慢得多 import numpy as np import pandas as pd import time d = {} n_cats = 400 n_data_cols = 5 cats = 10 * range(n_cats) d['cat'] = cats names = [] for i in range(n_data_cols): name =

我按单个列进行分组,然后转换多个数据列。这是可疑的缓慢,当我做它在一个单一的步骤。事实上,这比手动循环每个列进行转换然后组装结果要慢得多

import numpy as np
import pandas as pd
import time

d = {}
n_cats = 400
n_data_cols = 5
cats = 10 * range(n_cats)
d['cat'] = cats
names = []
for i in range(n_data_cols):
    name = 'data{}'.format(i)
    names.append(name)
    d[name] = i * np.arange(len(cats))
df = pd.DataFrame(d)
grp = df.groupby('cat')

print 'all at once'
%timeit _ = grp[names].transform(max)
print 'list comprehension'
%timeit _ = pd.concat([grp[name].transform(max) for name in names], axis=1)
产生:

all at once
1 loop, best of 3: 159 ms per loop
list comprehension
100 loops, best of 3: 4.9 ms per loop

请注意,如果我减少
n_cats
并增加
n_reps
,我可以得到相反的结果。但python循环似乎不应该更快。这不是我认为它应该做的吗?这两种方法产生相同的数字输出。

我无法重现您的计时;“一次完成”方法为我提供了更好的性能。您使用的是什么版本的pandas?一次100个循环,每个循环的最佳时间为3:5.4毫秒-列出100个循环,每个循环的最佳时间为3:8.88毫秒我使用的是0.18,但刚刚升级到0.20,现在得到的结果与您相同。一下子就快了。感谢在上两个版本中修复此问题的人!