基于分位数对大熊猫列进行分箱

问题描述 投票:0回答:1

我有一个大熊猫数据框'火车'

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%分位数并创建相应的箱子。例如,如果您为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)

任何帮助,将不胜感激。

python pandas quantile
1个回答
1
投票

您可以在数据框中使用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
© www.soinside.com 2019 - 2024. All rights reserved.