Pandas & NumPy Academy · Lezione

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.

Lezione 2 di 413 passaggi

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     30

sort_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.1

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

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

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

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

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

Gratis per iniziare

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

  1. Ordinare in base ai valori delle colonne
  2. Ordinare in base all'indice
  3. Assegnare ranghi ai valori
  4. Impostare e reimpostare l'indice
← Torna a Pandas & NumPy Academy