根据分位数对 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
我有一个 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