2015-02-10 32 views
10

如何在python中使用pd.qut創建新的Bin/Bucket變量?Python Pandas使用pd.qcut創建新的Bin/Bucket變量

對於有經驗的用戶來說,這可能看起來很基本,但我對此並不十分清楚,並且在堆棧溢出/谷歌搜索上出奇的不直觀。一些徹底的搜索產生了這樣的結果(Assignment of qcut as new column),但它並沒有完全回答我的問題,因爲它沒有采取最後一步並將所有內容都放入分箱(即1,2,...)。

回答

3

編輯:下面的答案只對Pandas版本低於0.15.0有效。如果您運行的熊貓15或更高版本,請參見:

data3['bins_spd'] = pd.qcut(data3['spd_pct'], 5, labels=False) 

感謝@unutbu指點出來。 :)

假設你有一些你想要的數據,在我的情況下,選項差價,並且你想創建一個新的變量與每個觀察對應的桶。上面提到的鏈接,您可以通過這樣做:

print pd.qcut(data3['spd_pct'], 40) 

(0.087, 0.146] 
(0.0548, 0.087] 
(0.146, 0.5] 
(0.146, 0.5] 
(0.087, 0.146] 
(0.0548, 0.087] 
(0.5, 2] 

它給你什麼樣的bin端點對應於每個觀察。不過,如果你想對應的區號碼爲每個觀察,那麼你可以這樣做:

print pd.qcut(data3['spd_pct'],5).labels 

[2 1 3 ..., 0 1 4] 

全部放在一起,如果你想創建一個只區號碼一個新的變量,這應該足夠了:

data3['bins_spd']=pd.qcut(data3['spd_pct'],5).labels 

print data3.head() 

    secid  date symbol symbol_flag  exdate last_date cp_flag 0 5005 1/2/1997 099F2.37   0 1/18/1997   NaN  P 
1 5005 1/2/1997 09B0B.1B   0 2/22/1997 12/3/1996  P 
2 5005 1/2/1997 09B7C.2F   0 2/22/1997 12/11/1996  P 
3 5005 1/2/1997 09EE6.6E   0 1/18/1997 12/27/1996  C 
4 5005 1/2/1997 09F2F.CE   0 8/16/1997   NaN  P 

    strike_price best_bid best_offer  ...  close volume_y return 0   7500  2.875  3.2500  ...  4.5  99200 0.074627 
1   10000  5.375  5.7500  ...  4.5  99200 0.074627 
2   5000  0.625  0.8750  ...  4.5  99200 0.074627 
3   5000  0.125  0.1875  ...  4.5  99200 0.074627 
4   7500  3.000  3.3750  ...  4.5  99200 0.074627 

    cfadj_y open cfret shrout  mid spd_pct bins_spd 
0  1 4.5  1 57735 3.06250 0.122449   2 
1  1 4.5  1 57735 5.56250 0.067416   1 
2  1 4.5  1 57735 0.75000 0.333333   3 
3  1 4.5  1 57735 0.15625 0.400000   3 
4  1 4.5  1 57735 3.18750 0.117647   2 

[5 rows x 35 columns] 

希望這可以幫助別人。至少現在應該更容易搜索。 :)

7

在熊貓0.15.0或更新版本中,pd.qcut將返回一個系列,而不是一個分類,如果輸入是一個系列(就其本身而言,在您的情況)或labels=False。如果您設置labels=False,那麼qcut將返回一個以分箱的整數指示符爲值的Series。

所以未來證明你的代碼,你可以使用

data3['bins_spd'] = pd.qcut(data3['spd_pct'], 5, labels=False) 

,或者通過一個NumPy的數組pd.qcut所以你得到一個明確的返回值。 請注意,分類屬性labels is deprecated。改爲使用codes

data3['bins_spd'] = pd.qcut(data3['spd_pct'].values, 5).codes 
+0

太棒了!我沒有意識到這一點。謝謝你指出。 – sfortney 2015-02-10 23:12:24