python之Pandas 分组之值占分组总数的百分比不起作用

lautakyan007 阅读:27 2024-08-05 10:48:10 评论:0

使用数据框和 Pandas ,我试图找出每个值占“分组依据”类别总计的百分比

所以,使用tips 数据库,我想看看,对于每个性别/吸烟者,女性吸烟者/所有女性和女性不吸烟者/所有女性在总账单中的比例是多少(男性也是如此)

例如,

如果完整的数据集是:

Sex, Smoker, Day, Time, Size, Total Bill 
Female,No,Sun,Dinner,2, 20 
Female,No,Mon,Dinner,2, 40 
Female,No,Wed,Dinner,1, 10 
Female,Yes,Wed,Dinner,1, 15 

第一行的值将是 (20+40+10)/(20+40+10+15),因为这些是其他 3 个不吸烟女性的值

所以输出应该是这样的

Female No 0.823529412 
Female Yes 0.176470588 

但是,我似乎遇到了一些麻烦

当我这样做时,

import pandas as pd 
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-   book/master/ch08/tips.csv", sep=',') 
df.groupby(['sex', 'smoker'])[['total_bill']].apply(lambda x: x / x.sum()).head() 

我得到以下信息:

    total_bill 
0   0.017378 
1   0.005386 
2   0.010944 
3   0.012335 
4   0.025151 

似乎忽略了分组,只为每个订单项计算它

我正在寻找类似的东西

df.groupby(['sex', 'smoker'])[['total_bill']].sum() 

哪个会返回

        total_bill 
sex smoker   
Female  No  977.68 
        Yes 593.27 
Male    No  1919.75 
       Yes  1337.07 

但我希望这表示为个人性别/吸烟者组合总数的百分比或

Female No  977.68/(977.68+593.27) 
Female Yes  593.27/(977.68+593.27) 
Male No  1919.75/(1919.75+1337.07) 
Male Yes  1337.07/(1919.75+1337.07) 

理想情况下,我想同时对“tip”列做同样的事情。

我做错了什么,我该如何解决?谢谢!

请您参考如下方法:

你可以在得到sum表后再添加一个按进程分组计算百分比:

(df.groupby(['sex', 'smoker'])['total_bill'].sum() 
   .groupby(level = 0).transform(lambda x: x/x.sum()))   # group by sex and calculate percentage 
 
#sex     smoker 
#Female  No        0.622350 
#        Yes       0.377650 
#Male    No        0.589455 
#        Yes       0.410545 
#dtype: float64 


标签:Python
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号