2015-10-31 25 views
2

我有一個埃博拉數據集與499記錄。我試圖根據概率(概率變量)找出每個五分位數中的觀測值的數量。觀察的數量應該落入類別0-20%,20-40%等我的代碼,我認爲要做到這一點,排序從qcut在熊貓python的五分之一輸出

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?

回答

3

你在做什麼本質上是正確的,但你可能有兩個問題:

  1. 我認爲你正在使用pd.cut()代替pd.qcut()
  2. 您多次申請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 
+0

感謝我多次使用value_counts()。我修改爲測試= pd.qcut(ebola.prob,5).value_counts(sort = False) – oldtimetrad