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())