Биннинг колонны панд на основе квантилей - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть кадр данных панд 'train' как

Name   Comb   Sales
Joy     A123   102
John    A134   112
Aby     A123   140
Amit    A123   190
Andrew  A134   210
Pren    A123   109
Abry    A134   230
Hulk    A134   188  
...

Для каждой уникальной Расчески я хочу найти 25% квантилей соответствующих продаж и создать соответствующие корзины. Например, если вы создадите 25% квантильных бункеров для продаж Comb = 'A123', вы получите (102,00 107,25 124.50 152.50 190,00). Теперь я хочу связать свои продажи для всех Comb = 'A123', используя эти квантили. Мои итоговые данные будут

Name   Comb   Sales  Bin  Bin_Low  Bin_High
Joy     A123   102    1    102     107.25
John    A134   112    1    112     169
Aby     A123   140    3    124.50  152.50
Amit    A123   190    4    152.90  190
Andrew  A134   210    3    199     215
Pren    A123   109    2    107.25  124.50
Abry    A134   230    4    215     230
Hulk    A134   188    2    169     199

Я создал приведенный ниже код, но мой окончательный кадр данных не отображается в нужном формате.

     quant = pd.DataFrame()
     i = ''
     for  i  in train.comb.unique():    
     a=pd.qcut(train[train.comb == i ]['Sales'], 4,duplicates='drop')
     df = pd.DataFrame(np.array(a))
     comp=pd.concat([train[train.combo == i ],df], axis=1)
     quant=quant.append(comp)

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 06 сентября 2018

Вы можете использовать qcut на вашем фрейме данных, сгруппированном по Comb. Затем присвойте левую сторону столбцу Bin_low, а правую - Bin_max. Обратите внимание, что qcut имеет открытый интервал на стороне left, поэтому значения будут немного отличаться от желаемого результата, но, по сути, будут такими же:

intervals = train.groupby('Comb')['Sales'].transform(pd.qcut, 4)

train['Bin_low'] = pd.IntervalIndex(intervals).left
train['Bin_high'] = pd.IntervalIndex(intervals).right

>>> train
     Name  Comb  Sales  Bin_low  Bin_high
0     Joy  A123    102  101.999    107.25
1    John  A134    112  111.999    169.00
2     Aby  A123    140  124.500    152.50
3    Amit  A123    190  152.500    190.00
4  Andrew  A134    210  199.000    215.00
5    Pren  A123    109  107.250    124.50
6    Abry  A134    230  215.000    230.00
7    Hulk  A134    188  169.000    199.00
...