Skapa en MultiIndex
Skapa ett hierarkiskt radindex med pd.MultiIndex.from_tuples eller set_index på flera kolumner och inspektera dess nivåer.
Skapa en MultiIndex är en gratis lektion i Pandas & NumPy Academy på CoddyKit. Detta är lektion 1 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Pandas & NumPy Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Pandas & NumPy Academy innehåller totalt 4 lektioner.
Vad är ett MultiIndex?
Ett MultiIndex (även kallat hierarkiskt index) gör det möjligt för en Pandas DataFrame eller Series att ha flera nivåer av radetiketter. Tänk på det som en sammansatt nyckel i en databas: i stället för att identifiera en rad med en enda etikett identifierar ni den med en tupel som (land, stad) eller (år, kvartal). MultiIndex är nödvändiga för att representera paneldata, tvärsnittsvisa tidsserier och alla datamängder med en naturlig grupperingsstruktur på två nivåer.
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)Skapa ett MultiIndex med from_tuples
pd.MultiIndex.from_tuples(list_of_tuples, names=) är det tydligaste sättet att skapa ett MultiIndex. Varje tupel blir en radetikett och dess element blir nivåerna. Parametern names tilldelar varje nivå en etikett (t.ex. ['year', 'quarter']). Metoden är användbar när ni har en färdig lista med sammansatta nycklar som ni vill använda som radindex.
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)Skapa ett MultiIndex med from_product
pd.MultiIndex.from_product(iterables, names=) skapar ett MultiIndex från den kartesiska produkten av flera listor – alltså varje kombination av element från indatalistorna. Detta är den smidigaste metoden när alla kombinationer av nivåerna ska finnas i data. Till exempel skapar alla kombinationer av 3 år × 4 kvartal × 5 regioner automatiskt en balanserad panel med 60 rader.
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())Skapa ett MultiIndex med set_index
Det vanligaste sättet att skapa ett MultiIndex i praktiken är att börja med en vanlig DataFrame som har grupperingskolumner och sedan anropa df.set_index([col1, col2]). Då flyttas kolumnerna från datakolumner till indexnivåer. Resultatet är detsamma som om ni hade byggt indexet från grunden med from_tuples, men det kräver bara en rad när ni utgår från tabelldata.
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)Inspektera MultiIndex-nivåer
Ett MultiIndex lagrar sina data i levels (de unika värdena på varje nivå) och codes (heltalspekare till nivåarrayerna). Inspektera nivåerna med df.index.levels eller df.index.get_level_values(level). Använd df.index.nlevels för att kontrollera hur många nivåer som finns. Attributet names listar namnet som tilldelats varje nivå – ange dessa med 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 för kolumner
Ett MultiIndex kan också användas för kolumner och därmed skapa en hierarki av kolumnetiketter. Detta är vanligt när ni lagrar flera mått för varje kategori i en pivottabelliknande layout – till exempel (intäkt, Q1), (intäkt, Q2), (kostnad, Q1), (kostnad, Q2). Åtkomst till kolumner sker på samma sätt som åtkomst till rader – med hjälp av tupler. Skapa ett MultiIndex för kolumner med pd.MultiIndex.from_product och tilldela det till 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 efter GroupBy-aggregering
När ni anropar groupby([col1, col2]).agg(...) får den resulterande DataFrame ett MultiIndex för raderna (de två groupby-nycklarna blir de två indexnivåerna) och eventuellt ett MultiIndex för kolumnerna (om ni aggregerar flera mått). Detta är det vanligaste sättet att stöta på ett MultiIndex i den dagliga dataanalysen – att förstå hur man navigerar i det är nödvändigt för att kunna arbeta med groupby-resultat.
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)Byta och ändra ordning på nivåer
Använd df.swaplevel() för att byta plats på två indexnivåer och df.reorder_levels([...]) för att ändra ordningen på alla nivåer. Det är användbart att ändra ordningen när ni vill göra ett urval efter en inre nivå först eller när två DataFrames har sina indexnivåer i olika ordning och måste justeras innan de slås samman. Anropa alltid sort_index() efter omordningen för att återställa lexikografisk ordning och effektivisera urval.
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())Kontrollera och sortera ett MultiIndex
Urval i ett MultiIndex är bara effektivt när indexet är lexikografiskt sorterat. Kontrollera om indexet är sorterat med df.index.is_monotonic_increasing. Om resultatet är False sorterar ni med df.sort_index(). Ett osorterat MultiIndex utlöser en PerformanceWarning vid intervallurval och kan ge felaktiga resultat i vissa specialfall – sortera därför alltid efter att ni har skapat eller ändrat ett 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)Återställa ett MultiIndex till kolumner
Anropa df.reset_index() för att konvertera alla indexnivåer tillbaka till vanliga kolumner och lämna DataFrame-objektet med ett enkelt heltalsbaserat RangeIndex. Detta är ett vanligt mönster efter groupby-aggregeringar: beräkna den grupperade sammanfattningen med ett MultiIndex och återställ sedan indexet för att få en platt DataFrame som lämpar sig för ytterligare Pandas-operationer, sammanfogning eller export till CSV. Använd reset_index(level='name') för att bara återställa en nivå i ett index med två nivåer.
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__)När ska ett MultiIndex användas
Använd ett MultiIndex när data har en naturlig hierarkisk struktur: tidsserier med deldygnsupplösning (datum + timme), paneldata (entitet + tidsperiod) eller nästlade grupperingar (land + region + stad). Undvik MultiIndex för enkla grupperingsnycklar med två kolumner, där en platt DataFrame med separata kolumner är lika lätt att läsa. Om Ni ständigt behöver anropa reset_index() bara för att komma åt data, är det ett tecken på att MultiIndex inte tillför något värde i Ert arbetsflöde.
Snabb kontroll
Testa Er förståelse av hur man skapar MultiIndex utifrån den här lektionen.
Sammanfattning av lektionen
I den här lektionen lärde Ni Er att MultiIndex tillhandahåller hierarkiska rad- (eller kolumn-)etiketter med tupler. De skapas med from_tuples, from_product eller set_index på flera kolumner och sorteras alltid för effektiv skivning. Härnäst går vi igenom hur man väljer data från ett MultiIndex med hjälp av .loc, tupler, skivor och hjälpfunktionen IndexSlice.
Lär dig Python med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 30
- Lektioner
- 120
Vanliga frågor
Är lektionen ”Skapa en MultiIndex” gratis?
Ja – hela texten till ”Skapa en MultiIndex” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Pandas & NumPy Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Pandas & NumPy Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Skapa en MultiIndex”?
Skapa ett hierarkiskt radindex med pd.MultiIndex.from_tuples eller set_index på flera kolumner och inspektera dess nivåer. Ni övar på Pandas & NumPy Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Pandas & NumPy Academy?
Du behöver inga förkunskaper. Utbildningen i Pandas & NumPy Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.
Hur lång tid tar lektionen ”Skapa en MultiIndex”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Pandas & NumPy Academy-lektionen?
Ja. Varje Pandas & NumPy Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Skapa en MultiIndex
- Välja data från en MultiIndex
- Indexjustering och omindexering
- Prestandafördelar med sorterade index