データフレーム列で groupby.transform を呼び出すと、データを変換する関数に列が渡されることを理解しています。しかし、私が理解できないのは、関数に複数の列を渡す方法です。
people = DataFrame(np.random.randn(5, 5), columns=['a', 'b', 'c', 'd', 'e'], index=['Joe', 'Steve', 'Wes', 'Jim', 'Travis'])
key = ['one', 'two', 'one', 'two', 'one']
今ではそのデータなどを簡単に侮辱することができますが、適切にできないように見えるのは、関数のパラメーターとして複数の列の値を使用してグループ内のデータを変換することです。たとえば、観測ごとに値 a.mean() - b.mean() * c を取る列「f」を追加したい場合、変換メソッドを使用してどのように達成できますか。
次のバリエーションを試しました
people['f'] = float(NA)
Grouped = people.groupby(key)
def TransFunc(col1, col2, col3):
return col1.mean() - col2.mean() * col3
Grouped.f.transform(TransFunc(Grouped['a'], Grouped['b'], Grouped['c']))
しかし、これは明らかに間違っています。関数をランバでラップすることも真実ですが、それをうまく機能させることはできません。
次の方法でグループを反復処理することで、結果を得ることができます。
for group in Grouped:
Amean = np.mean(list(group[1].a))
Bmean = np.mean(list(group[1].b))
CList = list(group[1].c)
IList = list(group[1].index)
for y in xrange(len(CList)):
people['f'][IList[y]] = (Amean - Bmean) * CList[y]
しかし、特にインデックスが一意でない場合、それは満足のいく解決策ではないようです。また、これは groupby.transform を使用して可能でなければならないことも知っています。
質問を一般化するには、複数の列の値を使用するパラメーターを持つデータを変換する関数をどのように作成すればよいでしょうか?
助けていただければ幸いです。