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!