我有一个包含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?
答案 0 :(得分:3)
您正在做的事情基本上是正确的,但您可能有两个问题:
pd.cut()
而不是pd.qcut()
。value_counts()
。(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