根据分位数对 pandas 列进行分箱

Binning a pandas column based on quantiles

我有一个 pandas 数据框 '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  
...

对于每个独特的 Comb,我想找到相应销售额的 25% 分位数并创建相应的 bin。例如,如果您为 Comb='A123' 的销售额创建 25% 的分位数箱,您将得到 (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)

如有任何帮助,我们将不胜感激。

您可以在数据框上使用 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