我正在尝试创建一个自定义DataFrame.describe()函数,该函数将返回
这应该重现我的问题
# 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()的输出,我也可以接受。
答案 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