4

関数に複数の引数がある場合に、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()

しかし、もちろん、仲介者関数をすべて一緒に切り取って、リスト内包表記で配列を使用するだけの方がよい場合もあります....

4

1 に答える 1

2

すべての引数をターゲット関数に渡すため、引数を渡すapplyことはたまたま機能します。apply

ただし、groupby複数の引数を取ります。ここを参照してください。そのため、引数を区別することはできません。ラムダ/名前付き関数を渡すことは、より明示的であり、進むべき道です。

これが私があなたが望むと思うことをする方法です(あなたの例にはすべての異なるグループがあるので少し変更されています)

In [22]: def f(x):
   ....:     result = Series('Greater',index=x.index)
   ....:     result[x<x.mean()] = 'Lesser'
   ....:     return result
   ....: 

In [25]: df = DataFrame(np.random.randn(5, 5), columns=['a', 'b', 'c', 'd', 'e'], index=['Joe', 'Joe', 'Wes', 'Wes', 'Travis'])

In [26]: df
Out[26]: 
               a         b         c         d         e
Joe    -0.293926  1.006531  0.289749 -0.186993 -0.009843
Joe    -0.228721 -0.071503  0.293486  1.126972 -0.808444
Wes     0.022887 -1.813960  1.195457  0.216040  0.287745
Wes    -1.520738 -0.303487  0.484829  1.644879  1.253210
Travis -0.061281 -0.517140  0.504645 -1.844633  0.683103

In [27]: df.groupby(df.index.values).transform(f)
Out[27]: 
              a        b        c        d        e
Joe      Lesser  Greater   Lesser   Lesser  Greater
Joe     Greater   Lesser  Greater  Greater   Lesser
Travis  Greater  Greater  Greater  Greater  Greater
Wes     Greater   Lesser  Greater   Lesser   Lesser
Wes      Lesser  Greater   Lesser  Greater  Greater
于 2013-11-04T12:47:51.587 に答える