如何将自定义函数列表传递给pandas.Dataframe.aggregate

时间:2018-02-13 12:40:51

标签: python pandas numpy lambda scipy

我正在尝试使用不同的自定义函数聚合pd.Dataframe,特别是来自scipy.stats。我可以使用单个函数来处理它,在这种情况下trim_mean

import pandas as pd
import numpy as np
from scipy.stats import trim_mean

df = pd.DataFrame(np.random.randn(100, 3), columns=['A', 'B', 'C'], index=pd.date_range('1/1/2000', periods=100))

# this works as expected
df.agg([np.sum, np.mean])

# now with a different function, works also
df.agg(lambda x: trim_mean(x, 0.2))

# apply also works
df.apply(lambda x: trim_mean(x, 0.2))

但是,df.agg([lambda x: trim_mean(x, 0.2)])IndexError: tuple index out of range'一样生成df.apply([lambda x: trim_mean(x, 0.2)])

我找到了old issue on pandas-dev,但这对我没有意义。

帮助,有人吗?

2 个答案:

答案 0 :(得分:2)

在功能列表之前需要lambda,以便返回DataFrame使用Series

c = ['trim_mean','mean','sum']
print (df.agg(lambda x: pd.Series([trim_mean(x, 0.2), np.mean(x), np.sum(x)], index=c)))

或者:

print (df.apply(lambda x: pd.Series([trim_mean(x, 0.2), np.mean(x), np.sum(x)], index=c)))
                   A         B         C
trim_mean  -0.143219 -0.018430 -0.097768
mean       -0.171887 -0.042308 -0.004843
sum       -17.188738 -4.230797 -0.484343

验证

print (df.agg([np.sum, np.mean]))
              A         B         C
sum  -17.188738 -4.230797 -0.484343
mean  -0.171887 -0.042308 -0.004843

print(df.agg(lambda x: trim_mean(x, 0.2)))
A   -0.143219
B   -0.018430
C   -0.097768
dtype: float64

答案 1 :(得分:1)

您将列表作为参数,并且它们都期望某些功能,因此请使用:

df.agg(*[lambda x: trim_mean(x, 0.2)])

或者:

df.apply(*[lambda x: trim_mean(x, 0.2)])

从列表中将这些函数解压缩为参数。

但是,如果你有多个lambda,你会遇到你用Google搜索的错误,因为它们的名称相同。