2013-10-27 17 views
11

グループキーとして関数を渡すと、インデックス値ごとに関数が呼び出され、戻り値がグループ名として使用されることがわかりました。私が理解できないことは、列値で関数を呼び出す方法です。Groupby with User Defined Functions Pandas

だから私はこれを行うことができます。これは、2つの長さが3以下のインデックス値を持っているそのうちの一つのグループと、長さ3以上と他にデータを分割

people = DataFrame(np.random.randn(5, 5), columns=['a', 'b', 'c', 'd', 'e'], index=['Joe', 'Steve', 'Wes', 'Jim', 'Travis']) 
def GroupFunc(x): 
    if len(x) > 3: 
     return 'Group1' 
    else: 
     return 'Group2' 

people.groupby(GroupFunc).sum() 

。しかし、どのようにして列の値の1つを渡すことができますか?したがって、たとえば、各インデックスポイントの列d値が1より大きい場合、私はちょうど次んでした実現:

people.groupby(people.a > 1).sum() 

しかし、私は今後の参考のために、ユーザー定義関数でこれを行う方法を知りたいです。

ような何か:

def GroupColFunc(x): 
if x > 1: 
    return 'Group1' 
else: 
    return 'Group2' 

しかし、どのように私はこれを呼ぶのですか?試しました

people.groupby(GroupColFunc(people.a)) 

などの亜種ですが、これは機能しません。

カラム値を関数に渡すにはどうすればよいですか? 複数の列の値をどのように渡しますか? people.a> people.bのようにグループ分けする?

> 1、グループに

答えて

19

、あなたは次のようにあなたの関数を定義することができます。

>>> def GroupColFunc(df, ind, col): 
...  if df[col].loc[ind] > 1: 
...   return 'Group1' 
...  else: 
...   return 'Group2' 
... 

Anが、その後

>>> people.groupby(lambda x: GroupColFunc(people, x, 'a')).sum() 
       a   b   c   d  e 
Group2 -2.384614 -0.762208 3.359299 -1.574938 -2.65963 

のようにそれを呼び出すか、あなただけの無名関数でそれを行うことができます。

>>> people.groupby(lambda x: 'Group1' if people['b'].loc[x] > people['a'].loc[x] else 'Group2').sum() 
       a   b   c   d   e 
Group1 -3.280319 -0.007196 1.525356 0.324154 -1.002439 
Group2 0.895705 -0.755012 1.833943 -1.899092 -1.657191 

documentationで述べたように、ラベルを指定して系列を渡すことでグループ化することもできます - >グループ名ma pping:

>>> mapping = np.where(people['b'] > people['a'], 'Group1', 'Group2') 
>>> mapping 
Joe  Group2 
Steve  Group1 
Wes  Group2 
Jim  Group1 
Travis Group1 
dtype: string48 
>>> people.groupby(mapping).sum() 
       a   b   c   d   e 
Group1 -3.280319 -0.007196 1.525356 0.324154 -1.002439 
Group2 0.895705 -0.755012 1.833943 -1.899092 -1.657191 
+0

徹底的な答えをありがとう。私はパンダのマッキンニーの本と一緒に作業しています。それは本当に徹底的に近いものですが、このような説明は追跡が難しいと感じています。ありがとうございました –

関連する問題