2017-06-30 4 views
1

私はパンダでの経験を積み重ねており、この課題にぶつかっています。 'B'、 'C​​'私は 'A'と 'B'でグループ化し、グループごとに 'C'のすべての値に基づいて計算します。結果は新しい追加列 'D'になります。パンダでグループ化する方法、すべてのグループで引数を持つ関数と戻り値を持つ

def myfunc(df, par): 
    {some complex calculation based on all values of df['C']} 
    return [dataframe or column] 

df_source['D'] = df_source.groupby(['A', 'B']).{call myfunc per group, and pass parameter value} 

私の質問:ここから「D」列を作成するにはどうすればよいですか?私が理解するように、を適用すると、グループではなく単一行で動作します。

更新:単一グループ内で、各行は、例えば、Dについて異なる値を有していてもよいですグループのi番目の要素/ n要素の文字列。

+0

'grouped_df.aggregate(FUNC)' 'すべてのグループ化されたオブジェクトに対してfunc'を適用します。 [pandas Group By](http://pandas.pydata.org/pandas-docs/stable/groupby.html)を参照してください。これらを連結して元のdfに追加することもできます。 –

答えて

2

私はあなたがflexible applyが必要だと思う:

def myfunc(x, p): 
    #y => return `Series` 
    return y 

df_source['D'] = df_source.groupby(['A', 'B'])['C'].apply(lambda x: myfunc(x, par)) 

別の可能な解決策は、transformを使用している:

df_source['D'] = df_source.groupby(['A', 'B'])['C'].transform(lambda x: myfunc(x, par)) 
+0

そして、もしmyfuncが2番目の引数(例えば数字)を受け取ったら? – AVS

+0

他のパラメータは定数ですか? – jezrael

+0

一回の実行では、はい、明示的に渡す必要があります。 – AVS

関連する問題