Creare un MultiIndex
Costruisca un indice gerarchico delle righe con pd.MultiIndex.from_tuples o con set_index su più colonne e ne esamini i livelli.
Creare un MultiIndex è una lezione Pandas & NumPy Academy gratuita su CoddyKit. Questa è la lezione 1 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.
Che cos'è un MultiIndex
Un MultiIndex (detto anche indice gerarchico) consente a un DataFrame o a una Series Pandas di avere più livelli di etichette per le righe. Lo consideri come una chiave composta in un database: invece di identificare una riga con una singola etichetta, la identifica con una tupla come (country, city) o (year, quarter). I MultiIndex sono essenziali per rappresentare dati panel, serie temporali trasversali e qualsiasi dataset con una naturale struttura di raggruppamento a due livelli.
import pandas as pd
# A simple example: sales by country and city
data = {
'sales': [100, 200, 150, 300, 80, 120]
}
index = pd.MultiIndex.from_tuples(
[('USA', 'New York'), ('USA', 'Chicago'),
('UK', 'London'), ('UK', 'Manchester'),
('DE', 'Berlin'), ('DE', 'Munich')],
names=['country', 'city']
)
df = pd.DataFrame(data, index=index)
print(df)Creare un MultiIndex con from_tuples
pd.MultiIndex.from_tuples(list_of_tuples, names=) è il modo più esplicito per creare un MultiIndex. Ogni tupla diventa un'etichetta di riga e i suoi elementi diventano i livelli. Il parametro names assegna un'etichetta a ciascun livello (ad esempio ['year', 'quarter']). Questo metodo è utile quando dispone di un elenco predefinito di chiavi composte da utilizzare come indice delle righe.
import pandas as pd
# Multi-level time index: year x quarter
tuples = [
(2022, 'Q1'), (2022, 'Q2'), (2022, 'Q3'), (2022, 'Q4'),
(2023, 'Q1'), (2023, 'Q2'), (2023, 'Q3'), (2023, 'Q4')
]
mi = pd.MultiIndex.from_tuples(tuples, names=['year', 'quarter'])
revenue = [120, 135, 145, 160, 130, 148, 162, 175]
df = pd.Series(revenue, index=mi, name='revenue_M')
print(df)Creare un MultiIndex con from_product
pd.MultiIndex.from_product(iterables, names=) crea un MultiIndex dal prodotto cartesiano di più elenchi, ovvero da ogni combinazione degli elementi degli elenchi di input. È il metodo più pratico quando nel dataset devono essere presenti tutte le combinazioni dei livelli. Ad esempio, tutte le combinazioni di 3 anni × 4 trimestri × 5 regioni creano automaticamente un panel bilanciato di 60 righe.
import pandas as pd
import numpy as np
years = [2021, 2022, 2023]
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
# Cartesian product: 3 years x 4 quarters = 12 combinations
mi = pd.MultiIndex.from_product([years, quarters], names=['year', 'quarter'])
print('Number of index entries:', len(mi))
print('First 6 entries:', mi[:6].tolist())
# Create a DataFrame with this index
df = pd.DataFrame({'revenue': np.random.randint(100, 200, 12)}, index=mi)
print('\n', df.head())Creare un MultiIndex con set_index
Il modo più comune per creare un MultiIndex nella pratica consiste nel partire da un DataFrame normale con colonne di raggruppamento e chiamare quindi df.set_index([col1, col2]). Questa operazione promuove tali colonne da colonne di dati a livelli dell'indice. Il risultato è lo stesso che si otterrebbe costruendo l'indice da zero con from_tuples, ma richiede una sola riga di codice a partire da dati tabulari.
import pandas as pd
# Start with a flat DataFrame
df_flat = pd.DataFrame({
'country': ['USA', 'USA', 'UK', 'UK', 'DE', 'DE'],
'year': [2022, 2023, 2022, 2023, 2022, 2023],
'gdp_bn': [25000, 26000, 3100, 3200, 4200, 4350]
})
# Promote two columns to a MultiIndex
df = df_flat.set_index(['country', 'year'])
print(df)
print('\nIndex type:', type(df.index).__name__)
print('Index names:', df.index.names)Esaminare i livelli di un MultiIndex
Un MultiIndex memorizza i dati in levels (i valori univoci di ciascun livello) e codes (puntatori interi agli array dei livelli). Esamini i livelli con df.index.levels o df.index.get_level_values(level). Utilizzi df.index.nlevels per verificare quanti livelli sono presenti. L'attributo names elenca il nome assegnato a ciascun livello: li imposti con df.index.set_names(['level0', 'level1']).
import pandas as pd
df_flat = pd.DataFrame({
'country': ['USA', 'USA', 'UK', 'UK'],
'year': [2022, 2023, 2022, 2023],
'gdp': [25000, 26000, 3100, 3200]
})
df = df_flat.set_index(['country', 'year'])
print('Number of levels:', df.index.nlevels)
print('Level names:', df.index.names)
print('Level 0 values:', df.index.get_level_values(0).tolist())
print('Level 1 values:', df.index.get_level_values(1).tolist())
print('Unique level 0:', df.index.get_level_values('country').unique().tolist())MultiIndex sulle colonne
Un MultiIndex può essere applicato anche alle colonne, creando una gerarchia di etichette di colonna. È una soluzione comune quando si memorizzano più metriche per ogni categoria in una struttura simile a una tabella pivot, ad esempio (revenue, Q1), (revenue, Q2), (cost, Q1), (cost, Q2). Acceda alle colonne con un MultiIndex nello stesso modo in cui accede alle righe, usando le tuple. Crei un MultiIndex per le colonne con pd.MultiIndex.from_product e lo assegni a df.columns.
import pandas as pd
import numpy as np
# Create a DataFrame with MultiIndex columns
metrics = ['revenue', 'cost']
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
col_index = pd.MultiIndex.from_product([metrics, quarters], names=['metric', 'quarter'])
data = np.random.randint(50, 200, size=(3, 8))
df = pd.DataFrame(data, columns=col_index, index=['USA', 'UK', 'DE'])
df.index.name = 'country'
print(df)MultiIndex dopo un'aggregazione GroupBy
Quando chiama groupby([col1, col2]).agg(...), il DataFrame risultante ha un MultiIndex sulle righe (le due chiavi di groupby diventano i due livelli dell'indice) e potenzialmente un MultiIndex sulle colonne (se aggrega più metriche). Questo è il modo più comune in cui ci si imbatte in un MultiIndex nell'analisi quotidiana dei dati: capire come esplorarlo è essenziale per lavorare con i risultati di groupby.
import pandas as pd
import seaborn as sns
tips = sns.load_dataset('tips')
# Two-key groupby creates a MultiIndex on rows
result = tips.groupby(['day', 'time'])['total_bill'].agg(['mean', 'count'])
print(result)
print('\nIndex type:', type(result.index).__name__)
print('Index names:', result.index.names)Scambiare e riordinare i livelli
Utilizzi df.swaplevel() per scambiare due livelli dell'indice e df.reorder_levels([...]) per modificare l'ordine di tutti i livelli. Il riordinamento è utile quando desidera suddividere i dati iniziando da un livello interno o quando due DataFrame hanno i livelli dell'indice in un ordine diverso e devono essere allineati prima dell'unione. Dopo il riordinamento, chiami sempre sort_index() per ripristinare l'ordine lessicografico e rendere efficiente la selezione per intervallo.
import pandas as pd
import seaborn as sns
tips = sns.load_dataset('tips')
result = tips.groupby(['day', 'time'])['total_bill'].mean()
print('Original levels:', result.index.names)
# Swap so time is the outer level
swapped = result.swaplevel().sort_index()
print('\nSwapped levels:', swapped.index.names)
print(swapped.head())Verificare e ordinare un MultiIndex
La selezione per intervallo in un MultiIndex è efficiente solo quando l'indice è ordinato lessicograficamente. Verifichi se l'indice è ordinato con df.index.is_monotonic_increasing. Se restituisce False, lo ordini con df.sort_index(). Un MultiIndex non ordinato genera un PerformanceWarning durante le operazioni di selezione per intervallo e, in alcuni casi limite, può restituire risultati errati: ordini sempre l'indice dopo aver creato o modificato un MultiIndex.
import pandas as pd
# Create an unsorted MultiIndex deliberately
tuples = [('B', 2), ('A', 1), ('B', 1), ('A', 2)]
mi = pd.MultiIndex.from_tuples(tuples, names=['letter', 'num'])
df = pd.DataFrame({'value': [10, 20, 30, 40]}, index=mi)
print('Is sorted:', df.index.is_monotonic_increasing)
print('Before sorting:')
print(df)
df_sorted = df.sort_index()
print('\nAfter sorting:')
print(df_sorted)
print('Is sorted:', df_sorted.index.is_monotonic_increasing)Reimpostare un MultiIndex come colonne
Chiami df.reset_index() per convertire tutti i livelli dell'indice nuovamente in colonne normali, lasciando al DataFrame un semplice RangeIndex intero. Questo è uno schema comune dopo le aggregazioni con groupby: calcoli il riepilogo raggruppato con un MultiIndex, poi reimposti l'indice per ottenere un DataFrame piatto, adatto a ulteriori operazioni Pandas, unioni o esportazioni in CSV. Usi reset_index(level='name') per reimpostare un solo livello di un indice a due livelli.
import pandas as pd
import seaborn as sns
tips = sns.load_dataset('tips')
result = tips.groupby(['day', 'time'])['total_bill'].mean()
print('MultiIndex result:')
print(result.head(4))
# Flatten back to a regular DataFrame
flat = result.reset_index()
print('\nFlattened DataFrame:')
print(flat.head(4))
print('Index type:', type(flat.index).__name__)Quando usare un MultiIndex
Usi un MultiIndex quando i dati hanno una struttura gerarchica naturale: serie temporali con granularità infragiornaliera (data + ora), dati panel (entità + periodo di tempo) o raggruppamenti annidati (paese + regione + città). Eviti i MultiIndex per semplici chiavi di raggruppamento a due colonne, quando un DataFrame piatto con colonne separate è altrettanto leggibile. Se si trova a chiamare continuamente reset_index() solo per accedere ai dati, questo indica che il MultiIndex probabilmente non aggiunge valore al flusso di lavoro.
Verifica rapida
Verifichi la propria comprensione della creazione di un MultiIndex illustrata in questa lezione.
Riepilogo della lezione
In questa lezione ha imparato che i MultiIndex forniscono etichette gerarchiche per righe (o colonne) usando tuple, create con from_tuples, from_product o set_index su più colonne, e che devono essere sempre ordinati per consentire slicing efficienti. Ora vedremo come selezionare dati da un MultiIndex usando .loc, tuple, slice e l'helper IndexSlice.
Domande Frequenti
La lezione «Creare un MultiIndex» è gratuita?
Sì — il testo completo di «Creare un MultiIndex» è 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 «Creare un MultiIndex»?
Costruisca un indice gerarchico delle righe con pd.MultiIndex.from_tuples o con set_index su più colonne e ne esamini i livelli. 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 1 di 4.
Quanto tempo richiede la lezione «Creare un MultiIndex»?
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
- Creare un MultiIndex
- Selezionare dati da un MultiIndex
- Allineamento e reindicizzazione degli indici
- Vantaggi prestazionali degli indici ordinati