此问题是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()))
谢谢!
答案 0 :(得分:1)
您可以使用apply
循环遍历数据框的各行(axis = 1
),您可以在每行中访问tip
和total_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