【问题标题】:Python create column to store mean of 95th percentile after groupby for certain valuesPython 创建列以存储 groupby 后某些值的第 95 个百分位数的平均值
【发布时间】:2021-05-25 19:22:01
【问题描述】:

我有一个看起来像这样的数据框

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

我正在尝试创建一个新列来存储 total_leads 的 95% 百分位数中的 total_leads(groupby 区域和部门)的平均值,其中该平均值仅根据 cq_closed_deal 大于 0 的值计算并且 total_leads 大于 0

生成的输出应如下所示

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

到目前为止,我所做的是使用下面的代码,但 total_leads 的 95% 平均值的计算适用于所有行,而不是 cq_close_deal > 0 和 total_leads > 0 的行

df['top_leads_avg'] = df.groupby(['region','dept'])['total_leads'].transform('quantile',0.95).mean()

还有什么需要补充的吗?感谢任何形式的帮助,谢谢。

【问题讨论】:

    标签: python pandas dataframe group-by


    【解决方案1】:

    您可以在第一步中将total_leads 替换为缺失值,如果不是两者都更大,例如Series.where 中的0

    mask = df['cq_closed_deal'].gt(0) & df['total_leads'].gt(0)
    
    print (df.assign(new = df['total_leads'].where(mask)))
                mail  cq_closed_deal  total_leads region    dept   new
    0  johnq@abc.com               1            4    ANZ  salesA   4.0
    1  grega@abc.com               0            0  ASEAN  salesB   NaN
    2  bruce@abc.com               1            6    ANZ  salesA   6.0
    3  danyi@abc.com               0            2  JAPAN  salesC   NaN
    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   NaN
    7  sanja@abc.com               1            0  ASEAN  salesB   NaN
    8  andyu@abc.com               0            0  JAPAN  salesA   NaN
    9  sandk@abc.com               1            1    ANZ  salesA   1.0
    

    然后对每个组的quantilemean 使用 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!
    猜你喜欢
    • 2017-09-15
    • 1970-01-01
    • 2011-10-10
    • 2020-08-07
    • 1970-01-01
    • 2021-02-07
    • 2017-08-23
    • 1970-01-01
    • 2022-01-14
    相关资源
    最近更新 更多