首页 > 解决方案 > 根据分子中是否包含值和分母中的唯一列值计算按百分比分组

问题描述

我正在尝试计算一个比率或百分比,它采用按列(服务列)分组的出现次数,该列至少具有两个可能值(食品或饮料)之一,然后将其除以唯一列的数量(业务df 中的列)值,但我遇到了麻烦。

原始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']

但这并没有给我我正在寻找的东西,因为在这种情况下,服务只为 cindy 提供了 df 中的所有行 4,而 Businees 列并没有给我准确的 # 她在按业务分组的食物或饮料的位置。

感谢您提前寻找和可能的帮助。

标签: pythonpython-3.xpandasdata-science

解决方案


我你认为你需要聚合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

推荐阅读