根据分子中是否包含值以及分母中是否包含唯一列值,按百分比计算分组

问题描述

我正在尝试计算一个比率或百分比,该比率或百分比采用具有至少两个可能值(食物或饮料)之一的按列分组(服务列)的出现次数,然后将其除以唯一值列中的“业务列”(Business Column)值,但出现了问题。

原始df:

Rep      | Business | Service
Cindy    Shakeshake    Food
Cindy    Shakeshake    Outdoor
Kim      BurgerKing    Beverage
Kim      Burgerking    Phone
Kim      Burgerking    Car
Nate     Tacohouse     Food
Nate     Tacohouse     Car
Tim      Cofeeshop     Coffee
Tim      Coffeeshop    Seating
Cindy    Italia        Seating
Cindy    Italia        Coffee



 Desired Output:
  Rep    | %
  Cindy    .5
  Kim       1
  Nate      1
  Tim       0

其中cindy拥有至少1个食品或饮料行的公司的数量除以df中她所有唯一公司的数量

我正在尝试以下操作:

     (df.assign(Service=df.Service.isin(['Food','Beverage']).astype(int))
       .groupby('Rep')
       .agg({'Business':'nunique','Service':'count'}))

s['Service']/s['Business']

但是,这并没有给我即时信息,因为在这种情况下,该服务仅提供df中cindy的所有行4,而Businees列未提供我按业务分组的食物或饮料位置的准确编号。

感谢您事先寻求帮助。

解决方法

我认为您需要汇总sum来计算匹配的值:

df1 = (df.assign(Service=df.Service.isin(['Food','Beverage']).astype(int))
       .groupby('Rep')
       .agg({'Business':'nunique','Service':'sum'}))
print (df1)
       Business  Service
Rep                     
Cindy         2        1
Kim           2        1
Nate          1        1
Tim           2        0

s = df1['Service']/df1['Business']
print (s)
Cindy    0.5
Kim      0.5
Nate     1.0
Tim      0.0
dtype: float64
,

您在此处的代码中犯了一个小错误:

s=(df.assign(Service=df.Service.isin(['Food','Service':'count'}))

s['Service']/s['Business']

您需要将'Service':'count'更改为'Service':'sum' count 仅计算每个Rep的行数。使用 sum ,它可以计算每个销售代表所提供的食物或饮料服务的行数。