Ordinare in base all'indice
Riordini le righe in base all'etichetta dell'indice con sort_index() e comprenda quando un indice ordinato migliori le prestazioni.
Ordinare in base all'indice è una lezione Pandas & NumPy Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Pandas & NumPy Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Pandas & NumPy Academy include 4 lezioni in totale.
Capire l'indice del DataFrame
Ogni DataFrame Pandas ha un indice delle righe: un insieme di etichette utilizzate per identificare e accedere alle righe. Per impostazione predefinita è un RangeIndex (0, 1, 2, …), ma può essere impostato su qualsiasi colonna (date, nomi, ID) usando set_index(). Quando l'indice è significativo (ad esempio, un DatetimeIndex o l'ID di un cliente), ordinarlo invece di ordinare in base al valore di una colonna produce un risultato organizzato logicamente.
import pandas as pd
df = pd.DataFrame(
{'value': [10, 20, 30]},
index=['C', 'A', 'B'] # out-of-order alphabetic index
)
print(df)
# value
# C 10
# A 20
# B 30sort_index() — Crescente
DataFrame.sort_index() riordina le righe in base all'etichetta dell'indice invece che ai valori delle colonne. Per impostazione predefinita, l'ordinamento è crescente: alfabetico per gli indici stringa, numerico per gli indici interi e cronologico per DatetimeIndex. Questo è il modo standard per ripristinare l'ordine naturale di un dataset dopo aver mescolato le righe o aggiunto record fuori sequenza.
import pandas as pd
df = pd.DataFrame(
{'temp': [22.5, 19.0, 25.1, 18.3]},
index=pd.to_datetime(['2024-03-01', '2024-01-15', '2024-06-10', '2024-01-01'])
)
sorted_df = df.sort_index()
print(sorted_df)
# temp
# 2024-01-01 18.3
# 2024-01-15 19.0
# 2024-03-01 22.5
# 2024-06-10 25.1sort_index() — Decrescente
Passi ascending=False per ordinare l'indice dal valore più grande (o più recente) al più piccolo (o più remoto). Per un DatetimeIndex, le osservazioni più recenti vengono così posizionate in alto, il layout tipico per dati finanziari, file di log e flussi di eventi in cui l'evento più recente è il più rilevante.
import pandas as pd
df = pd.DataFrame(
{'price': [100, 110, 105, 115]},
index=pd.to_datetime(['2024-01', '2024-02', '2024-03', '2024-04'])
)
# Most recent first
print(df.sort_index(ascending=False))
# price
# 2024-04-30 115
# 2024-03-31 105
# 2024-02-29 110
# 2024-01-31 100Ordinare le etichette delle colonne con axis=1
Per impostazione predefinita, sort_index() ordina l'indice delle righe (axis=0). Passi axis=1 per ordinare invece alfabeticamente le etichette delle colonne. È utile per standardizzare DataFrame estesi con molte colonne, in modo che le colonne compaiano in un ordine alfabetico prevedibile e sia più facile trovare visivamente una colonna o confrontare DataFrame.
import pandas as pd
df = pd.DataFrame({
'zebra': [1], 'apple': [2], 'mango': [3], 'banana': [4]
})
print('Before:', df.columns.tolist())
# ['zebra', 'apple', 'mango', 'banana']
sorted_cols = df.sort_index(axis=1)
print('After:', sorted_cols.columns.tolist())
# ['apple', 'banana', 'mango', 'zebra']Quando è più veloce un indice ordinato?
Pandas può utilizzare la ricerca binaria per cercare le etichette quando l'indice è ordinato (monotono). Un indice ordinato rende le selezioni con .loc['2024-01':'2024-06'] O(log n) invece di O(n). Il metodo is_monotonic_increasing (o is_monotonic_decreasing) restituisce un valore booleano che indica se l'indice è già ordinato. Ordinare un indice di grandi dimensioni prima di eseguire ripetutamente selezioni è un costo iniziale che vale la pena sostenere.
import pandas as pd
import numpy as np
idx = pd.to_datetime(['2024-03-01', '2024-01-15', '2024-06-10'])
df = pd.DataFrame({'v': [1, 2, 3]}, index=idx)
print('Sorted?', df.index.is_monotonic_increasing) # False
df = df.sort_index()
print('Sorted?', df.index.is_monotonic_increasing) # True
# Now slicing is efficient
print(df.loc['2024-01':'2024-03'])sort_index() con MultiIndex
Quando un DataFrame ha un MultiIndex (un indice gerarchico delle righe), sort_index() ordina per impostazione predefinita tutti i livelli della gerarchia. Può limitare l'ordinamento a livelli specifici con il parametro level. Un MultiIndex ordinato è necessario per eseguire in modo efficiente selezioni gerarchiche con .loc[(outer, inner), :].
import pandas as pd
arrays = [
['B', 'B', 'A', 'A'],
['two', 'one', 'two', 'one']
]
idx = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])
df = pd.DataFrame({'value': [10, 20, 30, 40]}, index=idx)
print(df.sort_index())
# value
# first second
# A one 40
# two 30
# B one 20
# two 10Ordinare un solo livello di MultiIndex
Con un MultiIndex, potrebbe voler ordinare solo il livello interno o quello esterno mantenendo invariato l'ordine dell'altro livello. Passi level= a sort_index(): accetta un intero (posizione del livello), una stringa (nome del livello) o un elenco. È utile quando l'ordine del livello esterno è già corretto e occorre ordinare solo all'interno di ciascun gruppo.
import pandas as pd
df = pd.DataFrame({
'sales': [300, 100, 200, 400, 150, 250]
}, index=pd.MultiIndex.from_tuples([
('Eng', 'Dave'), ('Eng', 'Alice'), ('Eng', 'Bob'),
('HR', 'Zoe'), ('HR', 'Carol'), ('HR', 'Eve')
], names=['dept', 'name']))
# Sort only the 'name' level alphabetically within each dept
print(df.sort_index(level='name'))
# sales
# dept name
# Eng Alice 100
# Bob 200
# Dave 300
# HR Carol 150
# Eve 250
# Zoe 400Differenza tra sort_index() e sort_values()
È importante distinguere i due metodi di ordinamento. sort_values(by='col') riordina le righe in base ai valori dei dati contenuti in una colonna. sort_index() riordina le righe in base all'etichetta della riga (l'indice), che può corrispondere o meno a una colonna. Quando l'indice è l'identificatore principale (ad esempio, un DatetimeIndex o una chiave stringa significativa), sort_index() è la scelta corretta.
import pandas as pd
df = pd.DataFrame(
{'value': [30, 10, 20]},
index=['C', 'A', 'B']
)
# sort_index: sorted by row label A, B, C
print(df.sort_index())
# value
# A 10
# B 20
# C 30
# sort_values: sorted by data value 10, 20, 30
print(df.sort_values('value'))
# value
# A 10
# B 20
# C 30
# (same here because values happen to match alphabetical label order!)Ripristino dell'ordine originale dopo le operazioni
Alcune operazioni (come il mescolamento o il campionamento casuale con df.sample(frac=1)) alterano l'ordine delle righe. sort_index() è il modo più semplice per ripristinare l'ordine sequenziale originale. Se l'ordine originale era un RangeIndex (0, 1, 2, …), sort_index() lo ripristina; se era un'etichetta significativa, ripristina l'ordinamento naturale di tale etichetta.
import pandas as pd
df = pd.DataFrame({'x': [10, 20, 30, 40, 50]})
# Shuffle (random sample)
shuffled = df.sample(frac=1, random_state=42)
print('Shuffled index:', shuffled.index.tolist())
# e.g. [2, 4, 0, 1, 3]
# Restore original order by sorting the index
restored = shuffled.sort_index()
print('Restored index:', restored.index.tolist())
# [0, 1, 2, 3, 4]sort_index() con na_position
Come sort_values(), anche sort_index() supporta na_position per controllare la posizione delle etichette di indice NaN. Questo è importante quando un DataFrame ha un indice di stringhe o di date che contiene alcune etichette NaN (possibile dopo operazioni che introducono valori mancanti nell'indice). Il valore predefinito è 'last'.
import pandas as pd
import numpy as np
df = pd.DataFrame(
{'v': [1, 2, 3, 4]},
index=['B', None, 'A', 'C']
)
print(df.sort_index(na_position='last'))
# v
# A 3
# B 1
# C 4
# NaN 2Misurazione del miglioramento delle prestazioni
È possibile misurare empiricamente il vantaggio in termini di prestazioni offerto da un indice ordinato usando timeit di Python per confrontare una selezione su un DatetimeIndex non ordinato e su uno ordinato. Nel caso ordinato viene utilizzata la ricerca binaria, che per i DataFrame di grandi dimensioni è in genere 5-20 volte più veloce. Questo dimostra perché sort_index() non è solo un'operazione estetica: ha conseguenze concrete sui tempi di esecuzione.
import pandas as pd
import numpy as np
np.random.seed(0)
random_dates = pd.to_datetime(
pd.Timestamp('2020-01-01').value + np.random.randint(0, 1_000_000_000_000_000, size=100_000),
unit='ns'
)
df = pd.DataFrame({'val': np.random.randn(100_000)}, index=random_dates)
# Without sort: O(n) scan
import timeit
t1 = timeit.timeit(lambda: df.loc['2022-01':'2022-06'], number=100)
df_sorted = df.sort_index()
t2 = timeit.timeit(lambda: df_sorted.loc['2022-01':'2022-06'], number=100)
print(f'Unsorted: {t1:.3f}s, Sorted: {t2:.3f}s, Speedup: {t1/t2:.1f}x')Verifica rapida
Verifichi la Sua comprensione dell'ordinamento per indice in Pandas.
Riepilogo della lezione
In questa lezione ha imparato che: sort_index() riordina le righe in base alla relativa etichetta (non ai valori delle colonne), axis=1 ordina alfabeticamente le etichette delle colonne e un indice ordinato abilita la ricerca binaria, rendendo molto più veloce la selezione basata sul tempo. Nei DataFrame MultiIndex, level= limita l'ordinamento a un livello della gerarchia. Verifichi sempre is_monotonic_increasing prima di fare affidamento su selezioni efficienti tramite intervalli. Nella prossima lezione assegneremo un rango ai valori all'interno di una colonna.
Impara Python con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 30
- Lezioni
- 120
Domande Frequenti
La lezione «Ordinare in base all'indice» è gratuita?
Sì — il testo completo di «Ordinare in base all'indice» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Pandas & NumPy Academy, passa a CoddyKit PRO. Il corso Pandas & NumPy Academy include 4 lezioni in totale.
Cosa imparerò in «Ordinare in base all'indice»?
Riordini le righe in base all'etichetta dell'indice con sort_index() e comprenda quando un indice ordinato migliori le prestazioni. Eserciti Pandas & NumPy Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Pandas & NumPy Academy?
Non è richiesta alcuna esperienza precedente. Pandas & NumPy Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Ordinare in base all'indice»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Pandas & NumPy Academy?
Sì. Ogni lezione Pandas & NumPy Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Ordinare in base ai valori delle colonne
- Ordinare in base all'indice
- Assegnare ranghi ai valori
- Impostare e reimpostare l'indice