Pandas DataFrame.apply对于scipy.stats的运行非常缓慢

时间:2018-11-06 16:11:37

标签: python pandas numpy dataframe scipy

我正在尝试创建一个自定义DataFrame.describe()函数,该函数将返回

  • numpy统计信息
  • 犯罪统计
  • 某些来源的分位数

这应该重现我的问题

# Python 3.6.6, Pandas 0.22.0

import pandas as pd
import numpy as np
import scipy.stats as sc

d = pd.DataFrame(np.random.randint(0,10, size=100000))
d.apply(np.mean) #Works
d.apply(np.std) #Works
d.apply(sc.kurtosis) #Works
d.apply([np.mean, np.std]) #Works
d.apply([np.mean, sc.kurtosis]) # Gets stuck

如果我包含scipy函数,它将永远运行,但是如果我仅使用numpy,它将很快完成。如果有更好的方法可以使用我自己的统计输出自定义列表来模仿pd.DataFrame.describe()的输出,我也可以接受。

1 个答案:

答案 0 :(得分:1)

pd.DataFrame.apply不是魔术。这只是Python级的循环和便捷的方法。除了这里,它并没有增加太多便利。它也不接受列表,因为它沿轴应用了单个函数,因此您的代码是错误的。

您可以将数据框直接作为所有这些函数的参数,这将表现出一致的性能:

# Python 3.6.0, Pandas 0.19.2

import pandas as pd
import numpy as np
import scipy as sc

np.random.seed(0)
d = pd.DataFrame(np.random.randint(0,10, size=10**6))

%timeit np.mean(d)                                          # 1.3 ms per loop
%timeit np.std(d)                                           # 2.82 ms per loop
%timeit sc.stats.kurtosis(d)                                # 33 ms per loop
%timeit [func(d) for func in (np.mean, np.std)]             # 3.95 ms per loop
%timeit [func(d) for func in (np.mean, sc.stats.kurtosis)]  # 34.8 ms per loop