2012-11-29 10 views
24

Ho il seguente dataframe che contiene i nomi delle canzoni, le loro posizioni in classifica di punta e il numero di settimane hanno trascorso nella posizione n ° 1:Come ordinare un DataFrame di Pandas in base a più criteri?

          Song   Peak   Weeks 
76       Paperback Writer    1    16 
117        Lady Madonna    1    9 
118         Hey Jude    1    27 
22       Can't Buy Me Love    1    17 
29       A Hard Day's Night    1    14 
48        Ticket To Ride    1    14 
56          Help!    1    17 
109      All You Need Is Love    1    16 
173    The Ballad Of John And Yoko    1    13 
85        Eleanor Rigby    1    14 
87       Yellow Submarine    1    14 
20     I Want To Hold Your Hand    1    24 
45         I Feel Fine    1    15 
60         Day Tripper    1    12 
61       We Can Work It Out    1    12 
10        She Loves You    1    36 
155         Get Back    1    6 
8        From Me To You    1    7 
115        Hello Goodbye    1    7 
2        Please Please Me    2    20 
92     Strawberry Fields Forever    2    12 
93         Penny Lane    2    13 
107      Magical Mystery Tour    2    16 
176         Let It Be    2    14 
0         Love Me Do    4    26 
157         Something    4    9 
166        Come Together    4    10 
58         Yesterday    8    21 
135      Back In The U.S.S.R.    19    3 
164       Here Comes The Sun    58    19 
96  Sgt. Pepper's Lonely Hearts Club Band    63    12 
105   With A Little Help From My Friends    63    7 

Mi piacerebbe classificare queste canzoni in ordine di popolarità, così ho' Mi piacerebbe ordinarli secondo i seguenti criteri: le canzoni che hanno raggiunto la posizione più alta vengono prima, ma se c'è un pareggio, le canzoni che sono rimaste nelle classifiche per il più lungo vengono prima.

Non riesco a capire come farlo a Panda.

risposta

5

Utilizzando .sort()

df.sort(['Peak', 'Weeks'], ascending=[True, False]) 

ordinerà in ordine ascendente di posizione di picco, quindi all'interno di tale ordine decrescente di lunghezza nei grafici.

+0

sì, per qualche motivo questo non è il caso. Ho pensato che dovrebbe funzionare anche in questo modo – mpjan

+0

@ user1715271 Potresti elaborare? cioè - cosa ottieni? –

+0

Inoltre, la modifica dei parametri per 'crescente' non cambia nulla ... – mpjan

30

Il panda 0.9.1 e versioni successive questo dovrebbe funzionare (questo è con 0.10.0b1):

(Edit:. Come di Panda 0,19, il metodo è deprecato sort_index Preferisco sort_values)

In [23]: songs.sort_index(by=['Peak', 'Weeks'], ascending=[True, False]) 
Out[23]: 
             Song Peak Weeks 
10       She Loves You  1  36 
118        Hey Jude  1  27 
20    I Want To Hold Your Hand  1  24 
22      Can't Buy Me Love  1  17 
56         Help!  1  17 
76      Paperback Writer  1  16 
109     All You Need Is Love  1  16 
45        I Feel Fine  1  15 
29      A Hard Day's Night  1  14 
48       Ticket To Ride  1  14 
85       Eleanor Rigby  1  14 
87      Yellow Submarine  1  14 
173   The Ballad Of John And Yoko  1  13 
60        Day Tripper  1  12 
61      We Can Work It Out  1  12 
117       Lady Madonna  1  9 
8       From Me To You  1  7 
115       Hello Goodbye  1  7 
155        Get Back  1  6 
2       Please Please Me  2  20 
107     Magical Mystery Tour  2  16 
176        Let It Be  2  14 
93        Penny Lane  2  13 
92    Strawberry Fields Forever  2  12 
0        Love Me Do  4  26 
166       Come Together  4  10 
157        Something  4  9 
58        Yesterday  8  21 
135     Back In The U.S.S.R. 19  3 
164      Here Comes The Sun 58  19 
96 Sgt. Pepper's Lonely Hearts Club Band 63  12 
105  With A Little Help From My Friends 63  7 
+2

Grazie! Sai se è possibile che il dataframe ricalcoli l'indice in base al nuovo ordine? (cioè in modo che l'indice associato a ciascuna riga del dataframe cresca secondo il nuovo ordinamento) –

+3

Questa è una vecchia domanda, ma nel caso qualcuno ne abbia ancora bisogno .. Ciò che si desidera può essere fatto usando [pandas.DataFrame.reset_index ] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.reset_index.html) (prova 'df.reset_index (drop = True, inplace = True)') – robodasha

+0

Per ricalcolare gli indici dopo l'ordinamento, prova 'df.index = intervallo (len (df))' – visitor

18
df.sort(['Peak', 'Weeks'], ascending=[True, False], inplace=True) 

Se si desidera che il risultato ordinato per uso futuro, è necessario inplace=True.

21

Da pandi 0.17.0, sort è obsoleto e sostituito da sort_values:

df.sort_values(['Peak', 'Weeks'], ascending=[True, False], inplace=True) 
0

Nel caso, se le dtypes di 'picco' e 'Settimana' non sono 'int' o 'float', allora usa il seguente comando.

df.convert_objects(convert_numeric=True).sort_values(['Peak', 'Weeks'], ascending=[True, False], inplace=True) 
Problemi correlati