从pandas python中的qcut排序五分位输出

时间:2015-10-31 09:34:57

标签: python sorting

我有一个包含499条记录的埃博拉数据集。我试图根据概率(概率变量)找到每个五分位数的观测数。观察数量应分为0-20%,20-40%等类别。我认为这样做的代码是,

test = pd.qcut(ebola.prob,5).value_counts()

返回

[0.044, 0.094]    111
(0.122, 0.146]    104
(0.106, 0.122]    103
(0.146, 0.212]     92
(0.094, 0.106]     89

我的问题是如何对此进行排序以返回0-20%,20-40%40-60%60-80%80-100%的正确观察数量?

我试过了

test.value_counts(sort=False)

返回

104    1
89     1
92     1
103    1
111    1

这是104,89,92,103,111的订单吗?每个五分之一?

我很困惑,因为如果我从第一段代码中查看概率输出,它看起来应该是111,89,103,104,92?

1 个答案:

答案 0 :(得分:3)

您正在做的事情基本上是正确的,但您可能有两个问题:

  1. 我认为您使用的是pd.cut()而不是pd.qcut()
  2. 您正在多次申请value_counts()
  3. (1)您可以在此处here引用此问题;当你使用pd.qcut()时,你应该在每个垃圾箱中有相同数量的记录(假设你的总记录可以被“垃圾箱”整除)。也许检查并确保您使用的是您打算使用的那个。

    以下是一些随机数据来说明(2):

    >>> np.random.seed(1234)
    >>> arr = np.random.randn(100).reshape(100,1)
    >>> df = pd.DataFrame(arr, columns=['prob'])
    >>> pd.cut(df.prob, 5).value_counts()
    
    (0.00917, 1.2]       47
    (-1.182, 0.00917]    34
    (1.2, 2.391]          9
    (-2.373, -1.182]      8
    (-3.569, -2.373]      2
    

    添加排序标记可以获得您想要的结果

    >>> pd.cut(df.prob, 5).value_counts(sort=False)
    
    (-3.569, -2.373]      2
    (-2.373, -1.182]      8
    (-1.182, 0.00917]    34
    (0.00917, 1.2]       47
    (1.2, 2.391]          9
    

    pd.qcut()

    >>> pd.qcut(df.prob, 5).value_counts(sort=False)
    
    [-3.564, -0.64]     20
    (-0.64, -0.0895]    20
    (-0.0895, 0.297]    20
    (0.297, 0.845]      20
    (0.845, 2.391]      20