2015-02-10 13 views
10

Làm cách nào để bạn tạo Biến Thùng/Thùng mới bằng pd.qut trong python?Dãy Python Tạo Biến Thùng/Thùng mới bằng pd.qcut

Điều này có vẻ là người dùng tiểu học có kinh nghiệm nhưng tôi không phải là siêu rõ ràng về điều này và nó là đáng ngạc nhiên unintuitive để tìm kiếm trên stack tràn/google. Một số tìm kiếm kỹ lưỡng mang lại điều này (Assignment of qcut as new column) nhưng nó không hoàn toàn trả lời câu hỏi của tôi bởi vì nó không thực hiện bước cuối cùng và đưa mọi thứ vào thùng (tức là 1,2, ...).

Trả lời

3

CHỈNH SỬA: Câu trả lời dưới đây chỉ hợp lệ đối với các phiên bản của Pandas nhỏ hơn 0.15.0. Nếu bạn đang chạy Pandas 15 trở lên, hãy xem:

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

Nhờ @unutbu vì đã chỉ ra. :)

Giả sử bạn có một số dữ liệu bạn muốn bin, trong trường hợp tùy chọn của tôi lan truyền và bạn muốn tạo biến mới với các nhóm tương ứng với mỗi quan sát. Liên kết được đề cập ở trên mà bạn có thể thực hiện điều này bằng cách:

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] 

cung cấp cho bạn điểm cuối bin tương ứng với mỗi quan sát. Tuy nhiên, nếu bạn muốn những con số bin tương ứng cho mỗi quan sát thì bạn có thể làm điều này:

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

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

Đưa nó tất cả cùng nhau nếu bạn muốn tạo một biến mới với chỉ số bin, điều này sẽ đủ:

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] 

Hy vọng điều này sẽ giúp người khác. Ít nhất thì việc tìm kiếm ngay bây giờ cũng dễ dàng hơn. :)

7

Trong Pandas 0.15.0 hoặc mới hơn, pd.qcut sẽ trả về một Chuỗi, không phải Phân loại nếu đầu vào là một Chuỗi (như trong trường hợp của bạn) hoặc nếu labels=False. Nếu bạn đặt labels=False, thì qcut sẽ trả về một chuỗi có chỉ số nguyên của các thùng dưới dạng giá trị.

Vì vậy, để tương lai chứng minh mã của bạn, bạn có thể sử dụng

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

hay, vượt qua một mảng NumPy để pd.qcut để bạn có được một phạm trù như giá trị trả về. Lưu ý rằng thuộc tính Phân loại labels is deprecated. Sử dụng codes thay thế:

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

Tuyệt vời! Tôi đã không nhận thức được điều đó. Cảm ơn vì chỉ ra điều ấy. – sfortney

Các vấn đề liên quan