在一个groupby 语句中实现多列计算
dfgp=dfal.groupby(['机构代码','机构']) \
.agg(
人力=('姓名','size'),//计数
预签人力=('是否预签','sum'),//求和
预签率=('是否预签',lambda x:sum(x)/len(x)*100), //本列未0,1,求和作为分子,计数作为分母
保费预估低档=('保费预估低档',lambda x:(x.sum()/10000).round(2)),//汇总后以万为单位四舍五入
保费预估中档=('保费预估中档',lambda x:(x.sum()/10000).round(2)),
保费预估高档=('保费预估高档',lambda x:(x.sum()/10000).round(2))
).reset_index() //重置索引,否则分组字段将被默认为索引
dfgpCnt= dfrlgpall.groupby(['ORGAN_ID',"机构"]) \
.agg(
总监=('grade_type4',lambda x: ( x=='总监').sum()),
高经=('grade_type4',lambda x: ( x=='高经').sum()),
业经=('grade_type4',lambda x: ( x=='业经').sum()),
业务员=('grade_type4',lambda x: ( x=='业务员').sum())
).reset_index()
#groupby apply lambda 的例子, 汇总以后,计算列涉及多列的计算
dfgpCnt=dfrlgpall.groupby(['ORGAN_ID',"机构"],as_index=False) \
.apply(lambda x: pd.Series({
'总监' : (x['grade_type4']=="总监").sum(),
'20件总监人力' :( (x['grade_type4']=="总监") & (x['预收件数']>=20) ).sum(),
'高经' : (x['grade_type4']=="高经").sum(),
'10件高经人力' :( (x['grade_type4']=="高经") & (x['预收件数']>=10) ).sum(),
'业经' : (x['grade_type4']=="业经").sum(),
'5件业经人力' :( (x['grade_type4']=="业经") & (x['预收件数']>=10) ).sum(),
})
)
df04=df03.groupby(['分公司','中支名称','四级机构名称','业务员姓名','业务员代码']) \
.apply(lambda x:pd.Series({
'件数':x.同一被保险人保单序号.sum(),
'保费':x.规则保费.sum(),
'太平福禄件数':x.是否含有太平福禄.sum(),
'福禄保费': x[x.是否含有太平福禄==1]['规则保费'].sum()
})
).reset_index()
##汇总单一值的方法 nunique, number of unique
gp01=dfdaitl.groupby(['三级机构']) \
.apply(lambda x:pd.Series({
# '参与代理人数':len(x['工号'].unique()),
'参与代理人数1':x['工号'].nunique(),
'参与客户数':len(x)
})
).reset_index()
#
df211=df21.groupby(['业务员代码']).agg(
长险期交保费=('承保期交',sum),
是否3000P=('承保期交',lambda x: 1 if x.loc[ x>= 3000].size >=1 else 0 ),
).reset_index()