我的数据框如下所示:
id salary days_employed category salary_percentile
1 200000 400 1 14
其中0类表示该人是早期的退出者,1表示他已经停留更长时间。
我的代码如下:
df1['salary_percentile'] = pd.qcut(df1['salary'], 50, labels=['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36','37','38','39','40','41','42','43','44','45','46','47','48','49','50'])
在切割了50个桶并检查第37个salary_percentile中的行之后,这就是我的数据帧的样子: [![在此处输入图像说明] [2]] [2]
def f(x):
early_quitter = x.loc[(x.category== '0')]
non = x.loc[(x.category == '1')]
proportion_early_quitters = early_quitter.shape[0]/x.shape[0]
return pd.Series({'prop_early_quitters': proportion_early_quitters})
bypercentile = df1.groupby('salary_percentile').apply(f)
bypercentile = bypercentile.reset_index(level='None')
bypercentile
我希望我的函数返回一个数据框,其中包含每个组中early_quitters的比例。即在每个组中,我想计算(len(early_quitter)/ len(group))。 当我使用此函数时,它返回每个组的0比例的数据帧。
有人可以帮我这个吗?
在旁注中,我使用上面显示的代码创建了salary_percentile列。
谢谢!
答案 0 :(得分:1)
首先,你得到零的原因是因为len
返回一个整数,当你在python 2中用整数除以整数时,你会得到一个整数,其值是除以小数部分的结果截断。所以“一些小于n的正数”/ n等于零。您可以使用float(len(early_quitter)) / len(group)
但是,如果早期戒烟者被标记为0,则1,否则早期戒烟者的比例为
float(len(early_quitters)) / len(group)
或者
1 - float(len(not_early_quitters)) / len(group)
或者因为这些值为1,len
生成的值与sum
1 - sum(not_early_quitters) / len(group)
但是,这是not_early_quitters
中group
的平均值的定义......所以
1 - mean(early_quitters)
您应该可以从使用
定义的变量中获取此信息1 - df1.groupby('salary_percentile').category.mean()