我有一个大熊猫数据框'火车'
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)
任何帮助,将不胜感激。
您可以在数据框中使用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