Python创建列以存储特定值在groupby之后的第95个百分位的平均值
我有一个像这样的数据框Python创建列以存储特定值在groupby之后的第95个百分位的平均值,python,pandas,dataframe,group-by,Python,Pandas,Dataframe,Group By,我有一个像这样的数据框 Email cq_closed_deal total_leads region dept johnq@abc.com 1 4 ANZ salesA grega@abc.com 0 0 ASEAN salesB bruce@abc.com 1 6 ANZ salesA
Email cq_closed_deal total_leads region dept
johnq@abc.com 1 4 ANZ salesA
grega@abc.com 0 0 ASEAN salesB
bruce@abc.com 1 6 ANZ salesA
danyi@abc.com 0 2 JAPAN salesC
jackc@abc.com 1 10 JAPAN salesC
kylev@abc.com 1 2 ASEAN salesB
petel@abc.com 0 0 ANZ salesB
sanja@abc.com 1 0 ASEAN salesB
andyu@abc.com 0 0 JAPAN salesA
sandk@abc.com 1 1 ANZ salesA
Email cq_closed_deal total_leads region dept top_leads_avg
johnq@abc.com 1 4 ANZ salesA 6
grega@abc.com 0 0 ASEAN salesB 2
bruce@abc.com 1 6 ANZ salesA 6
danyi@abc.com 0 2 JAPAN salesC 10
jackc@abc.com 1 10 JAPAN salesC 10
kylev@abc.com 1 2 ASEAN salesB 2
petel@abc.com 0 0 ANZ salesB 0
sanja@abc.com 1 0 ASEAN salesB 2
andyu@abc.com 0 0 JAPAN salesA 0
sandk@abc.com 1 1 ANZ salesA 6
我正在尝试创建一个新列来存储95%总潜在客户的总潜在客户(按地区和部门分组)的平均值,其中该平均值仅基于cq\U已完成交易超过0且总潜在客户超过0的客户进行计算
结果输出应该是这样的
Email cq_closed_deal total_leads region dept
johnq@abc.com 1 4 ANZ salesA
grega@abc.com 0 0 ASEAN salesB
bruce@abc.com 1 6 ANZ salesA
danyi@abc.com 0 2 JAPAN salesC
jackc@abc.com 1 10 JAPAN salesC
kylev@abc.com 1 2 ASEAN salesB
petel@abc.com 0 0 ANZ salesB
sanja@abc.com 1 0 ASEAN salesB
andyu@abc.com 0 0 JAPAN salesA
sandk@abc.com 1 1 ANZ salesA
Email cq_closed_deal total_leads region dept top_leads_avg
johnq@abc.com 1 4 ANZ salesA 6
grega@abc.com 0 0 ASEAN salesB 2
bruce@abc.com 1 6 ANZ salesA 6
danyi@abc.com 0 2 JAPAN salesC 10
jackc@abc.com 1 10 JAPAN salesC 10
kylev@abc.com 1 2 ASEAN salesB 2
petel@abc.com 0 0 ANZ salesB 0
sanja@abc.com 1 0 ASEAN salesB 2
andyu@abc.com 0 0 JAPAN salesA 0
sandk@abc.com 1 1 ANZ salesA 6
到目前为止,我所做的是使用下面的代码,但是总潜在客户95%的平均值的计算适用于所有行,而不是cq\U close\u deal>0和总潜在客户>0的行
df['top_leads_avg'] = df.groupby(['region','dept'])['total_leads'].transform('quantile',0.95).mean()
还有什么我需要补充的吗?感谢您提供的任何形式的帮助。您可以在第一步中重新计算
total\u leads
中缺少的值,如果不是像0
中这样的值:
然后对每组的分位数和平均值使用lambda函数:
df['top_leads_avg'] = (df.assign(new = df['total_leads'].where(mask))
.groupby(['region','dept'])['new']
.transform(lambda x: x.quantile(0.95).mean())
.fillna(0)
)
print (df)
mail cq_closed_deal total_leads region dept top_leads_avg
0 johnq@abc.com 1 4 ANZ salesA 5.8
1 grega@abc.com 0 0 ASEAN salesB 2.0
2 bruce@abc.com 1 6 ANZ salesA 5.8
3 danyi@abc.com 0 2 JAPAN salesC 10.0
4 jackc@abc.com 1 10 JAPAN salesC 10.0
5 kylev@abc.com 1 2 ASEAN salesB 2.0
6 petel@abc.com 0 0 ANZ salesB 0.0
7 sanja@abc.com 1 0 ASEAN salesB 2.0
8 andyu@abc.com 0 0 JAPAN salesA 0.0
9 sandk@abc.com 1 1 ANZ salesA 5.8
这很好,再次感谢@jezrael!