为什么 Pandas qcut 给我大小不等的垃圾箱?

ska*_*agr 7 python pandas

Pandas 文档对 qcut 函数有这样的说法:

根据等级或基于样本分位数将变量离散化为大小相等的桶。

所以我希望这段代码能给我 4 个箱子,每个箱子有 10 个值:

import numpy as np
import pandas as pd

np.random.seed(4242)

y = pd.Series(np.random.randint(low=1, high=10, size=40))
quartiles = pd.qcut(y, 4, labels=['1st', '2nd', '3rd', '4th'])

print('Quartiles:')
print(quartiles.value_counts(sort=False))

y.groupby(quartiles).agg(['count', 'mean']).plot(kind='bar');
Run Code Online (Sandbox Code Playgroud)

但是我得到了这个:

Quartiles:
1st    14
2nd     6
3rd    11
4th     9
dtype: int64
Run Code Online (Sandbox Code Playgroud)

图形

我在这里做错了什么?

小智 0

查看垃圾箱的边界突出了评论中指出的问题。

boundaries = [1, 2, 3.5, 6, 9]
Run Code Online (Sandbox Code Playgroud)

这些界限是正确的。pandas 的代码首先创建分位数(在 qcut 内)的值。随后,样品被放入箱中。2s 的范围与第一个四分位数的边界重叠。
第三个值的原因是低于阈值的值是 3,高于阈值的值是 4。调用 pandas 的函数分位数,使得边界位于两个相邻值之间。

结论:当样本数量较多时,像分位数这样的概念变得越来越合适,因此可以使用更多值来固定边界。