pandas.qcut和pandas.cut有什么区别?

Wil*_*llZ 76 python pandas

文件说:

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]]`
Run Code Online (Sandbox Code Playgroud)

Joh*_*hnE 185

首先,请注意分位数只是百分位数,四分位数和中位数等最通用的术语.您在示例中指定了五个箱,因此您要求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
Run Code Online (Sandbox Code Playgroud)

相反,因为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
Run Code Online (Sandbox Code Playgroud)

那是因为cut将根据值本身而不是这些值的频率选择均匀间隔的箱.因此,因为你从一个随机法线中得出,你会看到内部箱子中的频率更高,而外部箱子中的频率更少.这基本上是一个直方图的表格形式(你可以期望它是相当钟形的30条记录).

  • 谢谢你的明确解释,非常有帮助. (3认同)
  • 极好的答案。 (2认同)
  • 祝您圣诞快乐!并祝贺10k;) (2认同)
  • @JamesHulse这是一个公平的问题,但我没有一个一般性的答案。这仅取决于您是否在寻找绝对量度还是相对(分位数)量度。例如,考虑身高:您可能对相对高度(超过6英尺高)感兴趣,并使用`cut`,或者您可能更关心最高的5%,并使用`qcut` (2认同)

Ash*_*and 26

  • cut 命令创建等距的 bin,每个 bin 中的样本频率不相等
  • qcut 命令创建大小不等的 bin,每个 bin 中的样本频率相等。

在此处输入图片说明

    >>> 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
Run Code Online (Sandbox Code Playgroud)


小智 10

因此,qcut确保每个bin中值的分布更均匀,即使它们聚集在样本空间中也是如此.这意味着您不太可能拥有一个包含非常接近值的数据的bin和另一个具有0值的bin.一般来说,它的采样效果更好.