我知道如何使用pd.qcut在Pandas中创建简单的分位数。但是在搜索了一番之后,我并没有找到任何方法来创建加权分位数。具体而言,我想创建一个变量,将感兴趣的变量值(从最小到最大)分成等权重的不同区间。目前我的代码如下:
def wtdQuantile(dataframe, var, weight = None, n = 10):
if weight == None:
return pd.qcut(dataframe[var], n, labels = False)
else:
dataframe.sort_values(var, ascending = True, inplace = True)
cum_sum = dataframe[weight].cumsum()
cutoff = max(cum_sum)/n
quantile = cum_sum/cutoff
quantile[-1:] -= 1
return quantile.map(int)
有没有更简单的方式,或者Pandas中我遗漏了什么预构建的东西?
编辑: 根据要求,我提供一些样本数据。在下面的内容中,我试图使用"Weight"作为权重来分箱"Var"变量。使用pd.qcut
,我们可以获得每个箱中相同数量的观测值。相反,我想要每个箱中的等权重,或者在这种情况下,尽可能接近等权重。
Weight Var pd.qcut(n=5) Desired_Rslt
10 1 0 0
14 2 0 0
18 3 1 0
15 4 1 1
30 5 2 1
12 6 2 2
20 7 3 2
25 8 3 3
29 9 4 3
45 10 4 4