Python 带布尔过滤器标量的广播groupby

Python 带布尔过滤器标量的广播groupby,python,pandas,Python,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

我有一个数据框,如下所示

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 var1 var2 var3 var3_lt_50 0 a 0 20 60 14060 210060 3B3100 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 根据下面的代码,我通过两个步骤得到这个结果,一个是GROUPBY,一个是merge:

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')
df=df.merge(df[df.var3<50][[var1',var3']].groupby('var1',as_index=False).sum().rename(列={'var3':'var3_lt_50'})
,how='left'
,左上='var1'
,右上='var1')
有人能告诉我一种方法来做这种类型的布尔逻辑表达式+组间标量广播,而不需要我今天做的“groupby”+“merge”步骤吗。我想要一行更流畅的代码

提前感谢您的投入


/Swepab

您可以使用
groupby.transform
,它保留转换变量的形状和索引,以便您只需将结果分配回数据帧:

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

“还有你叔叔”—谢谢!一个快速的后续问题:如果我想将布尔表达式更改为另一个变量,而不是我求和的变量,那么会如何更改代码?举个例子,假设我想对其中的var2>4求和,并以与示例相同的方式将其广播回所有分组,您可以在
groupby.apply中使用
assign
,它是功能性的,并且能够广播标量值。类似于
df.groupby('var1',group\u keys=False).apply(lambda g:g.assign(new\u var=g.var3[g.var2>3].sum())