Pandas 分组 - 值占分组总数的百分比无效
Pandas Grouping - Values as Percent of Grouped Totals Not Working
使用数据框和 pandas,我试图找出每个值占 "group by" 类别
总计的百分比
因此,使用小费数据库,我想知道,对于每个 sex/smoker,女性吸烟者/所有女性和女性非吸烟者/所有女性(以及男人也一样)
例如,
如果完整的数据集是:
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()
哪个会 return
total_bill
sex smoker
Female No 977.68
Yes 593.27
Male No 1919.75
Yes 1337.07
但我希望将其表示为单个 sex/smoker 组合或
总和的百分比
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" 列执行相同的操作。
我做错了什么,我该如何解决?谢谢!
得到sum
table后可以再添加一个进程分组来计算百分比:
(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
使用数据框和 pandas,我试图找出每个值占 "group by" 类别
总计的百分比因此,使用小费数据库,我想知道,对于每个 sex/smoker,女性吸烟者/所有女性和女性非吸烟者/所有女性(以及男人也一样)
例如,
如果完整的数据集是:
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()
哪个会 return
total_bill
sex smoker
Female No 977.68
Yes 593.27
Male No 1919.75
Yes 1337.07
但我希望将其表示为单个 sex/smoker 组合或
总和的百分比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" 列执行相同的操作。
我做错了什么,我该如何解决?谢谢!
得到sum
table后可以再添加一个进程分组来计算百分比:
(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