如何在python中使用pd.qut創建新的Bin/Bucket變量?Python Pandas使用pd.qcut創建新的Bin/Bucket變量
對於有經驗的用戶來說,這可能看起來很基本,但我對此並不十分清楚,並且在堆棧溢出/谷歌搜索上出奇的不直觀。一些徹底的搜索產生了這樣的結果(Assignment of qcut as new column),但它並沒有完全回答我的問題,因爲它沒有采取最後一步並將所有內容都放入分箱(即1,2,...)。
如何在python中使用pd.qut創建新的Bin/Bucket變量?Python Pandas使用pd.qcut創建新的Bin/Bucket變量
對於有經驗的用戶來說,這可能看起來很基本,但我對此並不十分清楚,並且在堆棧溢出/谷歌搜索上出奇的不直觀。一些徹底的搜索產生了這樣的結果(Assignment of qcut as new column),但它並沒有完全回答我的問題,因爲它沒有采取最後一步並將所有內容都放入分箱(即1,2,...)。
編輯:下面的答案只對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]
希望這可以幫助別人。至少現在應該更容易搜索。 :)
在熊貓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
太棒了!我沒有意識到這一點。謝謝你指出。 – sfortney 2015-02-10 23:12:24