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

Posted

技术标签:

【中文标题】Pandas 分组 - 值占分组总数的百分比不起作用【英文标题】:Pandas Grouping - Values as Percent of Grouped Totals Not Working 【发布时间】:2017-02-23 07:07:57 【问题描述】:

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

所以,使用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”列做同样的事情。

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

【问题讨论】:

【参考方案1】:

你可以在得到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

【讨论】:

(df.groupby(['sex', 'smoker'])['total_bill','tip'].sum() .groupby(level = 0).transform(lambda x: x /x.sum())) 这似乎是同时计算小费的方法...谢谢! 请您看一下后续问题***.com/questions/40049347/…。谢谢

以上是关于Pandas 分组 - 值占分组总数的百分比不起作用的主要内容,如果未能解决你的问题,请参考以下文章

python使用pandas中的groupby函数和agg函数计算每个分组数据的两个分位数(例如百分之10分位数和百分之90分位数)

SQL 分组不起作用

NetSuite 已保存搜索 - 使用分组时显示总计/计算百分比

如何在分组条形图上方显示百分比

如何将日期分组为周?

Pig - 计算字段的总数百分比