2014-09-24 27 views
5

Tôi cố gắng để tìm tên cột được kết hợp với các giá trị lớn nhất và lớn thứ hai trong một DataFrame, đây là một ví dụ đơn giản (một trong những thực có hơn 500 cột):Pandas giá trị lớn thứ hai của

Date val1 val2 val3 val4 
1990 5  7 1 10 
1991 2  1 10 3 
1992 10 9 6 1 
1993 50 10 2 15 
1994 1  15 7 8 

nhu cầu để trở thành:

Date 1larg 2larg 
1990 val4 val2 
1991 val3 val4 
1992 val1 val2 
1993 val1 val4 
1994 val2 val4 

Tôi có thể tìm tên cột có giá trị lớn nhất (i, e, 1larg ở trên) với idxmax, nhưng làm cách nào để tìm giá trị lớn thứ hai?

Trả lời

6

(Bạn không có bất kỳ giá trị tối đa trùng lặp trong hàng của bạn, vì vậy tôi sẽ đoán rằng nếu bạn có [1,1,2,2] bạn muốn val3val4 được chọn.)

Một cách sẽ được sử dụng kết quả của argsort làm chỉ mục thành một Chuỗi có tên cột.

df = df.set_index("Date") 
arank = df.apply(np.argsort, axis=1) 
ranked_cols = df.columns.to_series()[arank.values[:,::-1][:,:2]] 
new_frame = pd.DataFrame(ranked_cols, index=df.index) 

sản xuất

  0  1 
Date    
1990 val4 val2 
1991 val3 val4 
1992 val1 val2 
1993 val1 val4 
1994 val2 val4 
1995 val4 val3 

(nơi tôi đã thêm một thêm 1995 [1,1,2,2] hàng.)

Ngoài ra, bạn có thể có thể melt sang một định dạng phẳng, chọn ra hai giá trị lớn nhất trong mỗi nhóm Ngày, sau đó bật lại.

+0

Thx, người đầu tiên làm việc hoàn hảo! – AtotheSiv

+0

Như đã nêu ở trên, điều này làm việc nhưng tôi gặp phải vấn đề sớm đủ. Tôi chạy vào một tình huống mà tất cả nhưng một trong các giá trị là số không. Có vẻ như Python sau đó chỉ cần lấy các giá trị lớn nhất và hai số không ngẫu nhiên (hoặc từ bên phải). Có cách nào để tạo ra tên cột khác không hai lần (cả trong col 0 và 1)? – AtotheSiv

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