在pandas python中对qcut的五分位数输出进行排序

old*_*rad 4 python sorting

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

test = pd.qcut(ebola.prob,5).value_counts()
Run Code Online (Sandbox Code Playgroud)

这返回

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

我的问题是如何排序以返回 0-20%、20-40% 40-60% 60-80% 80-100% 的正确观察数?

我试过了

test.value_counts(sort=False)
Run Code Online (Sandbox Code Playgroud)

这返回

104    1
89     1
92     1
103    1
111    1
Run Code Online (Sandbox Code Playgroud)

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

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

gob*_*s14 6

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

  1. 我认为您正在使用pd.cut()而不是pd.qcut().
  2. 你申请的value_counts()次数太多了。

(1) 你可以在这里参考这个问题;当您使用 时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
Run Code Online (Sandbox Code Playgroud)

添加排序标志会让你得到你想要的

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

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