pandas Panda Dataframe 百分比聚类

ljo96ir5  于 2022-11-20  发布在  其他
关注(0)|答案(1)|浏览(189)

比如我有一个数据框

count
A 20
B 20
C 15
D 10
E 10
F  8 
G  7
H  5
I  5

如果我想把它分成几组(最大75%、15%和最后10%),

count   Class
A     20     Top1       
B     20     Top1
C     15     Top1
D     10     Top1
E     10     Top1
F      8     Top2 
G      7     Top2
H      5     Top3
I      5     Top3

我如何实现这一点?我知道有一个pd.cut,但在pd.cut[target]中,它会削减有关计数的信息(只产生A,B,C等)。
谢谢

pgvzfuti

pgvzfuti1#

理论上,可以使用qcut

df['Class'] = pd.qcut(df['count'], q=[0, 0.1, 0.15, 1],
                      labels=['Top3', 'Top2', 'Top1'])

输出(注意略有不同的示例):

count Class
A     20  Top1
B     20  Top1
C     15  Top1
D     10  Top1
E     10  Top1
F      8  Top1
G      7  Top1
H      5  Top2
I      1  Top3 # this value was changed to ensure having 3 bins

但是qcut对空的箱子非常敏感,这在当前的情况下是行不通的。

s = pd.qcut(df['count'], q=[0, 0.1, 0.15, 1], duplicates='drop')
df['Class'] = s.cat.codes.rsub(len(s.cat.categories)).astype(str).radd('Top')

# for debugging
df['qcut'] = s
df['rank'] = df['count'].rank(pct=True) # not exactly the same computation

输出量:

count Class          qcut      rank
A     20  Top1   (5.4, 20.0]  0.944444
B     20  Top1   (5.4, 20.0]  0.944444
C     15  Top1   (5.4, 20.0]  0.777778
D     10  Top1   (5.4, 20.0]  0.611111
E     10  Top1   (5.4, 20.0]  0.611111
F      8  Top1   (5.4, 20.0]  0.444444
G      7  Top1   (5.4, 20.0]  0.333333
H      5  Top2  (4.999, 5.4]  0.166667
I      5  Top2  (4.999, 5.4]  0.166667

相关问题