Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas Grouping-基于另一列的值占分组总数的百分比_Python_Pandas_Dataframe_Aggregate_Aggregation - Fatal编程技术网

Python Pandas Grouping-基于另一列的值占分组总数的百分比

Python Pandas Grouping-基于另一列的值占分组总数的百分比,python,pandas,dataframe,aggregate,aggregation,Python,Pandas,Dataframe,Aggregate,Aggregation,这个问题是问题的延伸 使用数据框和pandas,我试图计算出一组中每个类别的小费百分比 所以,使用tips数据库,我想看看,对于每个性别/吸烟者,女性吸烟者/所有女性和女性非吸烟者/所有女性的小费百分比是多少(男性也是如此) 当我这样做的时候 import pandas as pd df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',') df.groupb

这个问题是问题的延伸

使用数据框和pandas,我试图计算出一组中每个类别的小费百分比

所以,使用tips数据库,我想看看,对于每个性别/吸烟者,女性吸烟者/所有女性和女性非吸烟者/所有女性的小费百分比是多少(男性也是如此)

当我这样做的时候

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=每组的总额(Tip)/总额(账单总额)

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

我知道这会给我小费占总小费的百分比:

(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()))

谢谢

您可以使用
apply
在数据帧的行中循环(轴为
axis=1
),对于每一行,您可以访问
tip
total\u 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