在python函数中作为参数传递GroupBy函数可以吗?我该如何传递他们的论点?

在python函数中作为参数传递GroupBy函数可以吗?我该如何传递他们的论点?,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我想要一个以GroupBy操作(如mean()、max())为参数的函数。我不确定如何包含这些函数的参数。例如,在分位数的情况下,有一个参数用于判断哪个分位数,所以在这种情况下,我应该能够提供这个额外的参数 def compute_moment(data, moment = pd.core.groupby.GroupBy.mean): # This builds columns that we will use to group. group_data = data.rank(

我想要一个以GroupBy操作(如mean()、max())为参数的函数。我不确定如何包含这些函数的参数。例如,在分位数的情况下,有一个参数用于判断哪个分位数,所以在这种情况下,我应该能够提供这个额外的参数

def compute_moment(data, moment = pd.core.groupby.GroupBy.mean):

    # This builds columns that we will use to group.
    group_data = data.rank(pct = True).round(1).add_suffix('_grouper')
    df = data.join(group_data)

    out = []
    for col in data.columns:
        #This is the key step, what if I want moment to be, say quantile(q = .7)?
        x = df.groupby(col+'_grouper').mean()[col] #no problem here
        y = moment(df.groupby(col+'_grouper'))['y']

        out += [pd.concat([x, y], axis=1)]

    return out

>>> out = compute_moment(data, pd.core.groupby.GroupBy.mean)

#output is a list of dataframes like this one:
>>> print out[0]

              rho         y
rho_grouper                    
0.0          0.024998  0.035754
0.1          0.099908  0.036522
0.2          0.199903  0.032319
0.3          0.299908  0.038726
0.4          0.399907  0.034523
0.5          0.499907  0.031123
0.6          0.599909  0.031352
0.7          0.699908  0.030531
0.8          0.799902  0.031277
0.9          0.899904  0.028456
1.0          0.974912  0.029378
我想知道如何正确地执行此操作,或者为什么不执行此操作,一个更简单的替代方法是使用一个应用这些groupby操作的函数,并允许我在必要时传递参数


顺便问一下,可以将pandas.GroupBy函数作为参数传递吗?

可以传递您想要的任何内容,只要它工作正常并且对您有好处。 您可以将函数的AGR作为额外的dict/元组参数传递,也可以只使用*args和**kwargs

不过,你想在这里实现什么还不清楚。 首先,看起来您在处理函数中的
数据
df
。 其次,如果我理解正确的话,
pd.core.groupby.groupby
是数据对象的一个类-它是从
df.groupby
中得到的,而不是相反。因此,你不应该在这里使用它

但是,您可以简单地将字符串或agg函数作为参数传递,然后在
.agg
方法中应用它们:

def foo(df, agg='mean'):
    momentum = df.groupby('grouper').agg(agg)
通过这种方式,您可以将字符串('mean','sum')或数组,或dict,甚至函数传递到
agg
arguement)。此外,在这种情况下,数组将导致将数组中的所有函数应用于所有列,因此您不必联接,也不必循环

要了解更多有关
groupby
工作原理的信息,请查看此处,例如:

非常感谢您的回答。我必须写groupby函数的全名(
pd.core.groupby.groupby.mean
),因为如果只写
mean
,它会告诉我mean没有定义。我的问题是,如果我不选择
mean
而选择
quantile
,我需要一个额外的参数
quantile(q=.7)
,我不确定如何从foo函数的定义处理这种情况。使用*args和**kwargs