2017-02-08 10 views
2

私は以下のデータフレームを持っています。私が欲しいブロードキャストgroupby with pandasブール値フィルタスカラー

df = pd.DataFrame({'var1' : list('a' * 3) + list('b' * 2) + list('c' * 4) 
     ,'var2' : [i for i in range(9)] 
     ,'var3' : [20, 40, 100, 10, 80, 12,24, 53, 90] 
    }) 

最終的な結果は以下の通りです:

 

    var1 var2 var3 var3_lt_50 
0 a 0 20 60 
1 a 1 40 60 
2 a 2 100 60 
3 b 3 10 10 
4 b 4 80 10 
5 c 5 12 36 
6 c 6 24 36 
7 c 7 53 36 
8 c 8 90 36 

私は以下のコードによると、グループ・バイとマージを通じて、二段階でこの結果が得られます。

df = df.merge(df[df.var3 < 50][['var1', 'var3']].groupby('var1', as_index = False).sum().rename(columns = {'var3' : 'var3_lt_50'}) 
     ,how = 'left' 
     ,left_on = 'var1' 
     ,right_on = 'var1') 

"groupby" + "merge"ステップimを使わずに、このタイプのブール論理式+ interbybyスカラーのブロードキャストを行う方法を教えてもらえますか?よりスムーズなコードが必要です。入力を事前に

おかげで、

/Swepab

答えて

4

あなたが戻ったばかりのデータフレームに結果を割り当てることができるように変換変数の形状だけでなく、インデックスを維持しているgroupby.transformを使用することができます。

df['var3_lt_50'] = df.groupby('var1').var3.transform(lambda g: g[g < 50].sum()) 
df 

enter image description here

+1

"とボブウル叔父" - ありがとう! – swepab

+0

速いフォローアップの質問:私がブール式を私が合計したもの以外の変数に変更したいのであれば、コードをどのように変更するのですか?たとえば、var2> 4の場所を合計して、その例と同じようにすべてのグループバイヤにブロードキャストしたいとします。 – swepab

+0

'groupby.apply'に' assign'を使用できます。スカラー値をブロードキャストする能力。ここでもまた、優れた、働きました(df.groupby( 'var1'、group_keys = False).apply(ラムダ:g.assign(new_var = g.var3 [g.var2> 3] .sum())) ' – Psidom