Skip to content

pandas: Ordinare DataFrame, Serie con sort_values(), sort_index()

Python

Per ordinare pandas.DataFrame e pandas.Series, utilizzare sort_values() e sort_index(). È possibile ordinare in ordine crescente o decrescente oppure in base a più colonne.

Si noti che il metodo sort() nella vecchia versione è obsoleto.

In questo articolo vengono descritti i seguenti contenuti.

  • Ordina per elemento (dati):sort_values()
    • Crescente o discendente:ascending
    • Ordina per più colonne
    • Maniglia NaN:na_position
    • Cambia oggetto originale:inplace
    • Ordina in direzione riga:axis
  • Ordina per indice/colonne (nomi di riga/colonna):sort_index()
    • Ordina per indice (nome riga)
    • Crescente o discendente:ascending
    • Cambia oggetto originale:inplace
    • Ordina per colonne (nome colonna):axis

I seguenti dati sono usati come esempio.

import pandas as pd

df = pd.read_csv('data/src/sample_pandas_normal.csv')
print(df)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

L’esempio utilizza pandas.DataFrame, ma pandas.Series fornisce anche reset_index(). L’uso è lo stesso.

Ordina per elemento (dati):sort_values()

Per ordinare in base al valore dell’elemento, utilizzare il metodo sort_values().

Specificare l’etichetta della colonna (nome colonna) in base alla quale ordinare il primo argomento.

df_s = df.sort_values('state')
print(df_s)
#       name  age state  point
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88
# 0    Alice   24    NY     64
# 5    Frank   30    NY     57
# 3     Dave   68    TX     70

Utilizzare reset_index() per riassegnare l’indice.

Crescente o discendente:ascending

L’impostazione predefinita è ordinare in ordine crescente. Se hai bisogno di un ordine decrescente, imposta l’argomento ascendente su False.

df_s = df.sort_values('state', ascending=False)
print(df_s)
#       name  age state  point
# 3     Dave   68    TX     70
# 0    Alice   24    NY     64
# 5    Frank   30    NY     57
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88

Ordina per più colonne

Se specifichi il primo argomento in base a un elenco, puoi ordinare per più colonne.

Ordina dal fondo dell’elenco in ordine. Infine, ordina in base alla prima colonna specificata nell’elenco.

df_s = df.sort_values(['state', 'age'])
print(df_s)
#       name  age state  point
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88
# 1      Bob   42    CA     92
# 0    Alice   24    NY     64
# 5    Frank   30    NY     57
# 3     Dave   68    TX     70

df_s = df.sort_values(['age', 'state'])
print(df_s)
#       name  age state  point
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88
# 0    Alice   24    NY     64
# 5    Frank   30    NY     57
# 1      Bob   42    CA     92
# 3     Dave   68    TX     70

Se l’argomento ascendente è specificato in un elenco, è possibile selezionare l’ordine crescente/decrescente per ciascuna colonna.

df_s = df.sort_values(['age', 'state'], ascending=[True, False])
print(df_s)
#       name  age state  point
# 2  Charlie   18    CA     70
# 0    Alice   24    NY     64
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57
# 1      Bob   42    CA     92
# 3     Dave   68    TX     70

Maniglia NaN:na_position

Se manca un valore NaN, per un valore predefinito, viene elencato alla fine.

df_nan = df.copy()
df_nan.iloc[:2, 1] = pd.np.nan
print(df_nan)
#       name   age state  point
# 0    Alice   NaN    NY     64
# 1      Bob   NaN    CA     92
# 2  Charlie  18.0    CA     70
# 3     Dave  68.0    TX     70
# 4    Ellen  24.0    CA     88
# 5    Frank  30.0    NY     57

df_nan_s = df_nan.sort_values('age')
print(df_nan_s)
#       name   age state  point
# 2  Charlie  18.0    CA     70
# 4    Ellen  24.0    CA     88
# 5    Frank  30.0    NY     57
# 3     Dave  68.0    TX     70
# 0    Alice   NaN    NY     64
# 1      Bob   NaN    CA     92

Se l’argomento na_position=’first’, è elencato in contralto.

df_nan_s = df_nan.sort_values('age', na_position='first')
print(df_nan_s)
#       name   age state  point
# 0    Alice   NaN    NY     64
# 1      Bob   NaN    CA     92
# 2  Charlie  18.0    CA     70
# 4    Ellen  24.0    CA     88
# 5    Frank  30.0    NY     57
# 3     Dave  68.0    TX     70

Vedere gli articoli seguenti su come rimuovere e sostituire i valori mancanti.

Cambia oggetto originale:inplace

Per impostazione predefinita, vengono restituiti nuovi oggetti ordinati, ma se l’argomento inplace è impostato su True, l’oggetto originale stesso viene modificato.

df.sort_values('state', inplace=True)
print(df)
#       name  age state  point
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88
# 0    Alice   24    NY     64
# 5    Frank   30    NY     57
# 3     Dave   68    TX     70

Ordina in direzione riga:axis

Come negli esempi precedenti, per la funzione predefinita, l’ordinamento viene eseguito nella direzione della colonna (direzione verticale).

Se si desidera eseguire l’ordinamento nella direzione della riga, impostare l’asse degli argomenti su 1. È possibile utilizzare altri argomenti allo stesso modo degli esempi precedenti.

Poiché si verifica un errore quando un numero e una stringa vengono mischiati, in questo esempio le colonne stringa vengono eliminate in modo che le colonne utilizzate utilizzate solo colonne numeriche. Vedere il seguente articolo per il metodo drop().

df_d = df.drop(['name', 'state'], axis=1)
print(df_d)
#    age  point
# 1   42     92
# 2   18     70
# 4   24     88
# 0   24     64
# 5   30     57
# 3   68     70

df_d .sort_values(by=1, axis=1, ascending=False, inplace=True)
print(df_d)
#    point  age
# 1     92   42
# 2     70   18
# 4     88   24
# 0     64   24
# 5     57   30
# 3     70   68

Ordina per indice/colonne (nomi di riga/colonna):sort_index()

Per ordinare per indice/colonne (nomi di riga/colonna), utilizzare il metodo sort_index().

Ordina per indice (nome riga)

Per impostazione predefinita, sort_index() ordina nella direzione della colonna (direzione verticale) in base al nome della riga (etichetta).

print(df)
#       name  age state  point
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88
# 0    Alice   24    NY     64
# 5    Frank   30    NY     57
# 3     Dave   68    TX     70

df_s = df.sort_index()
print(df_s)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

Crescente o discendente:ascending

Come con sort_values(), l’impostazione predefinita è ordinare in ordine crescente. Se hai bisogno di un ordine decrescente, imposta l’argomento ascendente su False.

df_s = df.sort_index(ascending=False)
print(df_s)
#       name  age state  point
# 5    Frank   30    NY     57
# 4    Ellen   24    CA     88
# 3     Dave   68    TX     70
# 2  Charlie   18    CA     70
# 1      Bob   42    CA     92
# 0    Alice   24    NY     64

Cambia oggetto originale:inplace

Come con sort_values(), puoi usare l’argomento inplace. Impostandolo su True cambia l’oggetto originale.

df.sort_index(inplace=True)
print(df)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

Ordina per colonne (nome colonna):axis

Impostando asse=1, viene ordinato nella direzione della riga (direzione orizzontale) in base alle colonne (nome colonna). Altri argomenti possono essere utilizzati come negli esempi precedenti.

df_s = df.sort_index(axis=1)
print(df_s)
#    age     name  point state
# 0   24    Alice     64    NY
# 1   42      Bob     92    CA
# 2   18  Charlie     70    CA
# 3   68     Dave     70    TX
# 4   24    Ellen     88    CA
# 5   30    Frank     57    NY

df.sort_index(axis=1, ascending=False, inplace=True)
print(df)
#   state  point     name  age
# 0    NY     64    Alice   24
# 1    CA     92      Bob   42
# 2    CA     70  Charlie   18
# 3    TX     70     Dave   68
# 4    CA     88    Ellen   24
# 5    NY     57    Frank   30