2

データフレーム列で 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 を使用して可能でなければならないことも知っています。

質問を一般化するには、複数の列の値を使用するパラメーターを持つデータを変換する関数をどのように作成すればよいでしょうか?

助けていただければ幸いです。

4

2 に答える 2

5

メソッドを使用できますapply()

import numpy as np
import pandas as pl
np.random.seed(0)

people2 = pd.DataFrame(np.random.randn(5, 5), 
                      columns=['a', 'b', 'c', 'd', 'e'], 
                      index=['Joe', 'Steve', 'Wes', 'Jim', 'Travis'])
key = ['one', 'two', 'one', 'two', 'one']

Grouped = people2.groupby(key)

def f(df):
    df["f"] = (df.a.mean() - df.b.mean())*df.c
    return df

people2 = Grouped.apply(f)
print people2

一般化する方法が必要な場合:

Grouped = people2.groupby(key)

def f(a, b, c, **kw):
    return (a.mean() - b.mean())*c

people2["f"] = Grouped.apply(lambda df:f(**df))
print people2
于 2013-10-28T06:01:01.517 に答える
0

これは、HYRY (ありがとう) から提供された回答に基づいており、これを実現する方法を教えてくれました。私のバージョンは、関数を一般化し、関数が呼び出されたときに関数の引数を入力するだけです。関数はラムダで呼び出す必要があると思いますが:

import pandas as pd
import numpy as np
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']
people['f'] = ""
Grouped = people.groupby(key)

def FUNC(df, col1, col2, col3, col4):
    df[col1] = (df[col2].mean() - df[col3].mean())*df[col4]
    return df

people2 = Grouped.transform(lambda x: FUNC(x, 'f', 'a', 'b', 'c'))

これは、これを行う上で私が見た最良の方法のように思えます...基本的に、グループ化されたデータフレーム全体が x として関数に渡され、列を引数として呼び出すことができます。

于 2013-10-28T06:31:18.670 に答える