関数に複数の引数がある場合に、pandas で groupby.apply または groupby.transform で使用する関数を記述する場合、関数を groupby の一部として呼び出す場合、引数は括弧ではなくコンマの後に続きます。例は次のとおりです。
def Transfunc(df, arg1, arg2, arg2):
return something
GroupedData.transform(Transfunc, arg1, arg2, arg3)
df 引数は最初の引数として自動的に渡されます。
ただし、関数を使用してデータをグループ化する場合、同じ構文は使用できないようです。次の例を見てください。
people = DataFrame(np.random.randn(5, 5), columns=['a', 'b', 'c', 'd', 'e'], index=['Joe', 'Steve', 'Wes', 'Jim', 'Travis'])
people.ix[2:3, ['b', 'c']] = NA
def MeanPosition(Ind, df, Column):
if df[Column][Ind] >= np.mean(df[Column]):
return 'Greater Group'
else:
return 'Lesser Group'
# This function compares each data point in column 'a' to the mean of column 'a' and return a group name based on whether it is greater than or less than the mean
people.groupby(lambda x: MeanPosition(x, people, 'a')).mean()
上記は問題なく機能しますが、関数をラムダでラップする必要がある理由がわかりません。transform と apply で使用される構文に基づいて、次のようにすれば問題なく動作するはずです。
people.groupby(MeanPosition, people, 'a').mean()
なぜ、またはラムダでラップせずに関数を呼び出す方法を教えてもらえますか?
ありがとう
編集:関数をラムダでラップせずにキーとして関数を渡してデータをグループ化することはできないと思います。考えられる回避策の 1 つは、関数をキーとして渡すのではなく、関数によって作成された配列を渡すことです。これは次のように機能します。
def MeanPositionList(df, Column):
return ['Greater Group' if df[Column][row] >= np.mean(df[Column]) else 'Lesser Group' for row in df.index]
Grouped = people.groupby(np.array(MeanPositionList(people, 'a')))
Grouped.mean()
しかし、もちろん、仲介者関数をすべて一緒に切り取って、リスト内包表記で配列を使用するだけの方がよい場合もあります....