【问题标题】:Groupby: Getting 'Count' and 'Percentage' In Same TableGroupby:在同一张表中获取“计数”和“百分比”
【发布时间】:2021-11-27 20:33:11
【问题描述】:

我正在处理tips 数据集:

# Load the data
tips = sns.load_dataset("tips")
tips.head()

total_bill  tip     sex  smoker day  time  size
0   16.99   1.01    Female  No  Sun Dinner  2
1   10.34   1.66    Male    No  Sun Dinner  3
2   21.01   3.50    Male    No  Sun Dinner  3
3   23.68   3.31    Male    No  Sun Dinner  2
4   24.59   3.61    Female  No  Sun Dinner  4

我想groupby timesmoker 列,然后计算每组中吸烟者的数量(包括他们的百分比)。我试图通过两个步骤来实现:

第 1 步:

# Count by groups
tips.groupby(['time', 'smoker']).agg({'smoker': 'count'})
               smoker
time    smoker  
Lunch    Yes    23
         No     45
Dinner   Yes    70
         No    106

第 2 步:

# Count with percentage
tips.groupby(['time', 'smoker']).agg({'smoker': 'count'}).transform(lambda x: x/x.sum()*100)
                 smoker
time    smoker  
Lunch    Yes    9.426230
          No    18.442623
Dinner   Yes    28.688525
          No    43.442623

我在 2 个单独的表格中得到结果。我想在同一个表中获得countpercentage

期望的输出:

               count   percentage
time    smoker  
Lunch    Yes    23     9.426230
         No     45     18.442623
Dinner   Yes    70     28.688525
         No    106     43.442623

有没有更好的方法呢?任何建议,将不胜感激。谢谢!

【问题讨论】:

  • 您能否扩展您的样本df,以便我们可以匹配您的输出?对于您提供的示例,“时间”列中没有“午餐”。否则修改您的输出以匹配您的示例。
  • @not_speshal、'Lunch' 和 'Dinner' 是 time 列的类。
  • 明白了!我重新创建了一个虚拟数据集,并且能够匹配您所需的输出

标签: python pandas dataframe group-by


【解决方案1】:

您可以使用transform 在另一条指令中计算百分比并将结果存储在另一列中。

tips_grouped = tips.groupby(['time', 'smoker']).agg({'smoker': 'count'}).to_frame()
tips_grouped["percentage"] = tips_grouped["count"].transform(lambda x: x/x.sum()*100)

【讨论】:

  • 非常感谢@sergio-penafiel。好多了!
【解决方案2】:

您可以使用named aggregation 对同一列进行多个聚合:

output = df.groupby(['time', 'smoker'])["smoker"].agg(Count="count", Percentage=lambda x: x.count()/df.shape[0]*100)

>>>                Count  Percentage
time   smoker                   
Dinner No        106   43.442623
       Yes        70   28.688525
Lunch  No         45   18.442623
       Yes        23    9.426230
输入df:
import random
df = pd.DataFrame({"time": ["Lunch"]*68+["Dinner"]*176,
                   "smoker": ["Yes"]*23+["No"]*45+["Yes"]*70+["No"]*106,
                   "sex": random.choices(["Male","Female"],k=100)})

【讨论】:

  • 真棒@not_speshal。这是完美的。您可以直接从seaborn 加载数据。谢谢!
  • 很高兴帮助@Roy! ^_^
猜你喜欢
  • 2018-11-25
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 2022-11-21
  • 2019-09-20
  • 2020-09-21
相关资源
最近更新 更多