2012-09-10 118 views
20

Làm cách nào để đặt hàng các cột theo các giá trị của hàng cuối cùng? Trong ví dụ dưới đây, df cuối cùng của tôi sẽ có các cột theo thứ tự sau: 'ddd' 'aaa' 'ppp' 'fff'.Cột thứ tự pandas Python theo các giá trị trong một hàng

>>> df = DataFrame(np.random.randn(10, 4), columns=['ddd', 'fff', 'aaa', 'ppp']) 
>>> df 
     ddd  fff  aaa  ppp 
0 -0.177438 0.102561 -1.318710 1.321252 
1 0.980348 0.786721 0.374506 -1.411019 
2 0.405112 0.514216 1.761983 -0.529482 
3 1.659710 -1.017048 -0.737615 -0.388145 
4 -0.472223 1.407655 -0.129119 -0.912974 
5 1.221324 -0.656599 0.563152 -0.900710 
6 -1.816420 -2.898094 -0.232047 -0.648904 
7 2.793261 0.568760 -0.850100 0.654704 
8 -2.180891 2.054178 -1.050897 -1.461458 
9 -1.123756 1.245987 -0.239863 0.359759 

Trả lời

22

[cập nhật để đơn giản hóa]

tl; dr:

In [29]: new_columns = df.columns[df.ix[df.last_valid_index()].argsort()] 

In [30]: df[new_columns] 
Out[30]: 
     aaa  ppp  fff  ddd 
0 0.328281 0.375458 1.188905 0.503059 
1 0.305457 0.186163 0.077681 -0.543215 
2 0.684265 0.681724 0.210636 -0.532685 
3 -1.134292 1.832272 0.067946 0.250131 
4 -0.834393 0.010211 0.649963 -0.551448 
5 -1.032405 -0.749949 0.442398 1.274599 

Một số lời giải thích sau. Thứ nhất, xây dựng DataFrame:

In [24]: df = pd.DataFrame(np.random.randn(6, 4), columns=['ddd', 'fff', 'aaa', 'ppp']) 

In [25]: df 
Out[25]: 
     ddd  fff  aaa  ppp 
0 0.503059 1.188905 0.328281 0.375458 
1 -0.543215 0.077681 0.305457 0.186163 
2 -0.532685 0.210636 0.684265 0.681724 
3 0.250131 0.067946 -1.134292 1.832272 
4 -0.551448 0.649963 -0.834393 0.010211 
5 1.274599 0.442398 -1.032405 -0.749949 

Lấy hàng cuối cùng:

In [26]: last_row = df.ix[df.last_valid_index()] 

Lấy chỉ số đó sẽ sắp xếp nó:

In [27]: last_row.argsort() 
Out[27]: 
ddd 2 
fff 3 
aaa 1 
ppp 0 
Name: 5, Dtype: int32 

Sử dụng này để chỉ số df:

In [28]: df[last_row.argsort()] 
Out[28]: 
     aaa  ppp  fff  ddd 
0 0.328281 0.375458 1.188905 0.503059 
1 0.305457 0.186163 0.077681 -0.543215 
2 0.684265 0.681724 0.210636 -0.532685 
3 -1.134292 1.832272 0.067946 0.250131 
4 -0.834393 0.010211 0.649963 -0.551448 
5 -1.032405 -0.749949 0.442398 1.274599 

Lợi nhuận!

1

Tôi sẽ sử dụng chuyển vị và phương pháp loại (trong đó hoạt động trên các cột):

df = pd.DataFrame(np.random.randn(10, 4), columns=['ddd', 'fff', 'aaa', 'ppp']) 
last_row_name = df.index[-1] 
sorted_df = df.T.sort(columns=last_row_name).T 

Bạn có thể phải chịu một hiệu suất hit nhưng nó là nhanh chóng và dễ dàng.

5

Phương thức sort_values thực hiện điều này trực tiếp khi được đưa ra đối số axis=1.

sorted_df = df.sort_values(df.last_valid_index(), axis=1) 

Vì vậy, nó không còn cần thiết để transpose các dataframe để sắp xếp theo một hàng. Ngoài ra, phương pháp sort hiện không được chấp nhận.

-1
df=df[df.iloc[-1,:].sort_values().index] 

này hoạt động

+8

Mã chỉ câu trả lời arent khuyến khích như họ không cung cấp nhiều thông tin cho độc giả tương lai vui lòng cung cấp một số giải thích cho những gì bạn đã viết – WhatsThePoint

+0

@WhatsThePoint: +1 từ bên cạnh tôi. Husimu: Vui lòng cung cấp câu trả lời của bạn với các mô tả rõ ràng. Không viết mã, đưa ra lời giải thích về mã mà bạn đã chia sẻ, để những người khác cũng có thể hiểu và nó sẽ hữu ích. Tôi yêu cầu bạn đọc phần Câu hỏi thường gặp theo thứ tự để sử dụng Stack Overflow một cách hiệu quả. –

+1

Vui lòng giải thích lý do tại sao tính năng này hoạt động. – Matt

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