该文件说:
http://pandas.pydata.org/pandas-docs/dev/basics.html
“可以使用cut(基于值的bin)和qcut(基于样本分位数的bin)函数离散化连续值”
对我来说听起来很抽象...我可以在下面的示例中看到差异,但是 qcut(样本分位数)实际上在做什么/意味着什么?什么时候使用qcut和cut?
谢谢。
factors = np.random.randn(30)
In [11]:
pd.cut(factors, 5)
Out[11]:
[(-0.411, 0.575], (-0.411, 0.575], (-0.411, 0.575], (-0.411, 0.575], (0.575, 1.561], ..., (-0.411, 0.575], (-1.397, -0.411], (0.575, 1.561], (-2.388, -1.397], (-0.411, 0.575]]
Length: 30
Categories (5, object): [(-2.388, -1.397] < (-1.397, -0.411] < (-0.411, 0.575] < (0.575, 1.561] < (1.561, 2.547]]
In [14]:
pd.qcut(factors, 5)
Out[14]:
[(-0.348, 0.0899], (-0.348, 0.0899], (0.0899, 1.19], (0.0899, 1.19], (0.0899, 1.19], ..., (0.0899, 1.19], (-1.137, -0.348], (1.19, 2.547], [-2.383, -1.137], (-0.348, 0.0899]]
Length: 30
Categories (5, object): [[-2.383, -1.137] < (-1.137, -0.348] < (-0.348, 0.0899] < (0.0899, 1.19] < (1.19, 2.547]]`
最佳答案
首先,请注意,分位数只是百分位数,四分位数和中位数之类的最通用术语。您在示例中指定了五个垃圾箱,因此您要向qcut
索取五分位数。
因此,当您使用qcut
要求五分位数时,将选择bin,以便每个bin中的记录数相同。您有30条记录,因此每个bin中应有6条记录(您的输出应如下所示,尽管断点因随机抽取而有所不同):
pd.qcut(factors, 5).value_counts()
[-2.578, -0.829] 6
(-0.829, -0.36] 6
(-0.36, 0.366] 6
(0.366, 0.868] 6
(0.868, 2.617] 6
相反,对于
cut
,您会看到更加不均匀的内容:pd.cut(factors, 5).value_counts()
(-2.583, -1.539] 5
(-1.539, -0.5] 5
(-0.5, 0.539] 9
(0.539, 1.578] 9
(1.578, 2.617] 2
这是因为
cut
将根据值本身而不是这些值的频率来选择要均匀分布的垃圾箱。因此,由于您是从随机法线中提取的,因此您会看到内部垃圾箱中的频率更高,而外部垃圾箱中的频率更低。本质上,这将是直方图的表格形式(您会期望它具有30条记录的相当钟形)。