熊猫分组 - 基于另一列的分组总数的百分比

时间:2016-10-14 17:58:02

标签: python pandas dataframe aggregate aggregation

此问题是a question I asked yesterday, but I will rephrase

的扩展

使用数据框和pandas,我试图弄清楚组中每个类别的提示百分比是多少。

所以,使用提示数据库,我想看看,对于每个性别/吸烟者,女性吸烟者/所有女性和女性非吸烟者/所有女性(男性同样的事情)的提示百分比是多少? / p>

当我这样做时,

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','tip']].sum()

我得到以下内容:

        total_bill  tip
sex smoker      
Female  No  977.68  149.77
        Yes 593.27  96.74
Male    No  1919.75 302.00
        Yes 1337.07 183.07

但我正在寻找更像这样的东西

        Tip Pct
Female  No  0.153189183
        Yes 0.163062349
Male    No  0.15731215
        Yes 0.136918785

其中Tip Pct =每个组的sum(tip)/ sum(total_bill)

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

据我所知,这会给我提示总提示的百分比:

(df.groupby(['sex', 'smoker'])['tip'].sum().groupby(level = 0).transform(lambda x: x/x.sum()))

有没有办法修改它以查看另一列,即

(df.groupby(['sex', 'smoker'])['tip'].sum().groupby(level = 0).transform(lambda x: x/x['total_bill'].sum()))

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用apply循环遍历数据框的各行(axis = 1),您可以在每行中访问tiptotal_bill并将它们分开获得百分比:

(df.groupby(['sex', 'smoker'])[['total_bill','tip']].sum()
   .apply(lambda r: r.tip/r.total_bill, axis = 1))

#sex     smoker
#Female  No        0.153189
#        Yes       0.163062
#Male    No        0.157312
#        Yes       0.136919
#dtype: float64