文档说:
http://pandas.pydata.org/pandas-docs/dev/basics.html
“连续值可以使用切割(基于值的箱子)和qcut(基于样本分位数的箱子)功能离散化”
对我来说听起来很抽象......我可以看到下面例子中的差异,但 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]]`
答案 0 :(得分:159)
首先,请注意分位数只是百分位数,四分位数和中位数等词的最常用术语。您在示例中指定了五个分档,因此您要求qcut
询问五分位数。
因此,当您要求使用qcut
的五分位数时,将选择这些分箱,以便您在每个分档中拥有相同数量的记录。你有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条记录)。
答案 1 :(得分:9)
因此,qcut可确保每个bin中值的分布更均匀,即使它们聚集在样本空间中也是如此。这意味着您不太可能拥有一个包含非常接近值的数据的bin和另一个具有0值的bin。一般来说,它的采样效果更好。
答案 2 :(得分:3)
>>> x=np.array([24, 7, 2, 25, 22, 29])
>>> x
array([24, 7, 2, 25, 22, 29])
>>> pd.cut(x,3).value_counts() #Bins size has equal interval of 9
(2, 11.0] 2
(11.0, 20.0] 0
(20.0, 29.0] 4
>>> pd.qcut(x,3).value_counts() #Equal frequecy of 2 in each bins
(1.999, 17.0] 2
(17.0, 24.333] 2
(24.333, 29.0] 2
答案 3 :(得分:-1)
Pd.qcut在基于(((数组中的元素数)/(箱数-1)))进行划分时分配数组的元素,然后将其除以多。每个垃圾箱中的元素顺序排列。
Pd.cut根据((第一个+最后一个元素)/(箱数-1的个数))进行分割来分配数组的元素,然后根据它们所属的值的范围来分配元素。