将函数应用于python pandas

时间:2016-12-22 21:03:30

标签: python pandas

我的数据框如下所示:

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列。

谢谢!

1 个答案:

答案 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_quittersgroup的平均值的定义......所以

1 - mean(early_quitters)

您应该可以从使用

定义的变量中获取此信息
1 - df1.groupby('salary_percentile').category.mean()