2012-09-10 38 views
20

Jak zamawiać kolumny zgodnie z wartościami z ostatniego wiersza? W poniższym przykładzie mój ostateczny df będzie miał kolumny w następującej kolejności: "ddd" "aaa" "ppp" "fff".Kolumna Pandy Pythona według wartości z rzędu

>>> 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 

Odpowiedz

22

[zaktualizowane uprościć]

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 

Niektóre wyjaśnienie poniżej. Po pierwsze, zbudować 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 

Uzyskaj ostatni wiersz:

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

Get indeksy, które go sortowania:

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

użyć tego wskaźnika 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 

Zysk!

1

użyłbym transpozycji i metody sortowania (który działa na kolumnach):

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 

Możecie cierpią trafień wydajności, ale jest szybki i łatwy.

5

Metoda ta wykonuje bezpośrednio po podaniu argumentu axis=1.

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

Tak, to nie jest już konieczne w celu transpozycji dataframe sortowania przez rząd. Ponadto, metoda sort jest teraz przestarzała.

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

Działa

+8

tylko Kod odpowiedzi arent zachęcać, ponieważ nie dostarczają najwięcej informacji dla przyszłych czytelników proszę podać jakieś wyjaśnienie tego, co zostało napisane – WhatsThePoint

+0

@WhatsThePoint: +1 z mojej strony. Husimu: Proszę podać odpowiedź z wyraźnymi opisami. Nie pisz tego kodu, podaj objaśnienia kodu, który udostępniłeś, aby inni mogli go zrozumieć i będzie to pomocne. Proszę o przeczytanie sekcji FAQ w celu efektywnego wykorzystania Stack Overflow. –

+1

Proszę wyjaśnić, dlaczego to działa. – Matt

Powiązane problemy