如何获得四分位数并根据此四分位数范围对值进行分类
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
转换为 d
。 assign
的“排名”列也使用 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
我有这个 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
转换为 d
。 assign
的“排名”列也使用 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