熊猫分组 - 分组总数不起作用的百分比值

时间:2016-10-14 00:40:55

标签: python pandas dataframe aggregate aggregation

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

所以,使用小费数据库,我希望看到,对于每个性别/吸烟者,总账单占女性吸烟者/所有女性和女性非吸烟者/所有女性的比例(男性同样的事情) )

例如,

如果完整数据集是:

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)

理想情况下,我希望同时使用“提示”列。

我做错了什么,如何解决这个问题?谢谢!

1 个答案:

答案 0 :(得分:8)

在获得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