如何获得四分位数并根据此四分位数范围对值进行分类

how to get quartiles and classify a value according to this quartile range

我有这个 df:

d = pd.DataFrame({'Name':['Andres','Lars','Paul','Mike'],
                  'target':['A','A','B','C'],
                  'number':[10,12.3,11,6]})

我想将每个数字分类为四分位数。我这样做:

(d.groupby(['Name','target','number'])['number']
 .quantile([0.25,0.5,0.75,1]).unstack()
 .reset_index()
 .rename(columns={0.25:"1Q",0.5:"2Q",0.75:"3Q",1:"4Q"})
)

但是如您所见,4 个四分位数都相等,因为上面的代码是按行计算的,所以如果每行有一个数字 1,则所有四分位数都相等。

如果 运行 改为:

d['number'].quantile([0.25,0.5,0.75,1])

然后我有我要找的 4 个四分位数:

0.25     9.000
0.50    10.500
0.75    11.325
1.00    12.300

我需要的输出(只显示前两行)

   Name    target   number     1Q      2Q      3Q        4Q     Rank
0   Andres  A       10.0       9.0    10.5    11.325    12.30     1
1   Lars    A       12.3       9.0    10.5    11.325    12.30     4

您可以看到所有四分位数的值都考虑了 number 列中的高值。除此之外,现在我们有一个列名称 Rank,它根据数字的四分位数对数字进行分类。前任。在第一行中,10 在第一个四分位数内。

这是一种基于您创建的分位数的方法,方法是将其设为 DataFrame 并将其 join 转换为 dassign 的“排名”列也使用 rank 方法:

out = (d.join(d['number'].quantile([0.25,0.5,0.75,1])
              .set_axis([f'{i}Q' for i in range(1,5)], axis=0)
              .to_frame().T
              .pipe(lambda x: x.loc[x.index.repeat(len(d))])
              .reset_index(drop=True))
       .assign(Rank=d['number'].rank(method='dense')))

输出:

     Name target  number   1Q    2Q      3Q    4Q  Rank
0  Andres      A    10.0  9.0  10.5  11.325  12.3   2.0
1    Lars      A    12.3  9.0  10.5  11.325  12.3   4.0
2    Paul      B    11.0  9.0  10.5  11.325  12.3   3.0
3    Mike      C     6.0  9.0  10.5  11.325  12.3   1.0