强制将qcut拆分为等概率的组

时间:2018-08-28 12:44:33

标签: python pandas

请考虑以下数据:

s = pd.Series([1, 1, 1, 2])
pd.qcut(s, 2, labels=False)

我想得到等概率的组,即[0, 0, 1, 1]。相反,qcut可以引发异常,也可以返回[0, 0, 0, 0](取决于重复的kwarg)。

我通过稍微干扰数据来获得等价组,即:

def my_qcut(s, *args, **kwargs):
    disturbed = np.array(s) + np.random.rand(len(s)) / 1000
    return pd.qcut(disturbed, *args, **kwargs)

尽管它似乎可行,但我觉得这太过分了。有人可以建议我分解为等概率组的确定性方法吗?

2 个答案:

答案 0 :(得分:4)

尝试:

pd.qcut(s.rank(method='first'), 2, labels=np.arange(2))

答案 1 :(得分:0)

使用Numpy的argsort进行排名

def qcut(s, n):
  k = len(s)
  a = s.values.argsort()
  b = np.empty_like(a)
  b[a] = np.arange(k) * n // k
  return pd.Series(b, s.index)

qcut(s, 2)

0    0
1    0
2    1
3    1
dtype: int64