Внедрение qcut для разделения на равновероятные группы - PullRequest
0 голосов
/ 28 августа 2018

Рассмотрим следующие данные:

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 голосов
/ 28 августа 2018

Использование Numpy's 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
0 голосов
/ 28 августа 2018

Попробуйте:

pd.qcut(s.rank(method='first'), 2, labels=np.arange(2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...