2017-12-06 3 views
1

mean()、max()などのGroupBy操作を引数として取る関数が必要です。これらの関数の引数をどのように含めるかについてはわかりません。例えば、クォンタイルの場合は、どのクォンタイルを伝えるかという議論があります。このような場合、この余分な議論を提供できるはずです。python関数でpandas GroupBy関数を引数として渡すことはできますか?どのように私は彼らの議論を通過する必要がありますか?

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関数を渡しても問題ありませんか?

答えて

0

正常に動作していれば、必要なものはそのまま渡しても問題ありません。 関数のagrsを追加のdict/tuple引数として渡すことも、* argsと** kwargsだけを使うこともできます。

まだ、ここで達成したいことは不明です。 まず、関数内にdatadfがついているようです。 第2に、私が正しいことを理解すれば、pd.core.groupby.GroupByはデータオブジェクトのクラスです。それはdf.groupbyから得られるものです。したがって、ここでは使用しないでください。

しかし、あなたは、単にarguementとして文字列またはAGG機能を渡し、その.agg方法でそれらを適用することができます。

def foo(df, agg='mean'): 
    momentum = df.groupby('grouper').agg(agg) 

あなたが渡すことができます。この方法のいずれかの文字列(「平均」、「合計」)または配列、またはdicts、あるいは機能をagg arguementに変換します)。さらに、この場合、配列内のすべての関数がすべての列に適用されるため、結合する必要はなく、ループする必要はありません。

例えば、ここを見てどのようgroupby仕事、についての詳細を学ぶために: https://chrisalbon.com/python/pandas_apply_operations_to_groups.html

+0

は答えをありがとうございました。 groupby関数( 'pd.core.groupby.GroupBy.mean')のフルネームを書く必要がありました。なぜなら、' mean'を書くだけで_meanが定義されていないと言えるからです。 私の質問は、 'mean'の代わりに' quantile'を選択すると、 'quantile(q = .7)'という余分な引数が必要で、foo関数の定義からその状況をどのように扱うべきかわかりません。 –

+0

* argsと** kwargsを使用する –

関連する問題