Memilih Data dari MultiIndex
Ambil data pada tingkat indeks luar dan dalam menggunakan .loc dengan tupel, irisan, dan pembantu pd.IndexSlice.
Memilih Data dari MultiIndex adalah pelajaran Pandas & NumPy Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Pandas & NumPy Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.
Menavigasi Data Hierarkis
Setelah memiliki MultiIndex, Anda memerlukan cara yang efisien untuk mengambil subset data. Pandas menyediakan tiga alat untuk ini: .loc dengan tuple untuk pemilihan label yang tepat, slice() dan pd.IndexSlice untuk pemilihan rentang di berbagai tingkat, serta .xs() untuk pemilihan irisan silang pada nilai tingkat tertentu. Menguasai pola akses ini akan membuka seluruh kemampuan pengindeksan hierarkis.
import pandas as pd
import numpy as np
# Setup: GDP data by country and year
df_flat = pd.DataFrame({
'country': ['USA','USA','USA','UK','UK','UK','DE','DE','DE'],
'year': [2021, 2022, 2023, 2021, 2022, 2023, 2021, 2022, 2023],
'gdp_bn': [23000, 25000, 26000, 3000, 3100, 3200, 4100, 4200, 4350]
})
df = df_flat.set_index(['country', 'year']).sort_index()
print(df)Memilih Berdasarkan Tingkat Terluar dengan .loc
Berikan satu label tingkat terluar kepada .loc[] untuk mengambil semua baris dalam grup tersebut. Dengan MultiIndex dua tingkat (negara, tahun), df.loc['USA'] mengembalikan semua baris USA sebagai DataFrame dengan hanya indeks terdalam (tahun) yang tersisa. Perilaku ini disebut penghapusan tingkat — ketika Anda memilih nilai tertentu pada tingkat terluar, Pandas menghapus tingkat tersebut dari indeks objek yang dikembalikan.
import pandas as pd
df_flat = pd.DataFrame({
'country': ['USA','USA','USA','UK','UK','UK'],
'year': [2021, 2022, 2023, 2021, 2022, 2023],
'gdp_bn': [23000, 25000, 26000, 3000, 3100, 3200]
})
df = df_flat.set_index(['country', 'year']).sort_index()
# Select all USA rows
usa = df.loc['USA']
print('All USA rows:')
print(usa)
print('\nRemaining index type:', usa.index.name)Memilih Tuple Tertentu dengan .loc
Untuk mengambil satu baris yang diidentifikasi oleh kedua tingkat indeks, berikan sebuah tuple kepada .loc[]: df.loc[('USA', 2022)]. Ini mengembalikan Series (atau skalar untuk satu kolom) yang sesuai tepat dengan kombinasi label (terluar, terdalam) tersebut. Anda harus memasukkan tuple ke dalam sebuah daftar df.loc[[('USA', 2022)]] jika ingin mendapatkan DataFrame, bukan Series.
import pandas as pd
df_flat = pd.DataFrame({
'country': ['USA','USA','USA','UK','UK','UK'],
'year': [2021, 2022, 2023, 2021, 2022, 2023],
'gdp_bn': [23000, 25000, 26000, 3000, 3100, 3200],
'cpi': [3.2, 5.1, 4.8, 2.5, 3.4, 3.0]
})
df = df_flat.set_index(['country', 'year']).sort_index()
# Single row as Series
print('USA 2022 (Series):')
print(df.loc[('USA', 2022)])
# Single row as DataFrame
print('\nUSA 2022 (DataFrame):')
print(df.loc[[('USA', 2022)]])Memilih Beberapa Baris dengan Daftar Tuple
Untuk memilih beberapa baris tertentu sekaligus, berikan daftar tuple kepada .loc[]. Ini berguna ketika Anda memerlukan subset baris yang tidak berurutan dan diidentifikasi oleh kunci gabungan — misalnya, data tahun 2022 untuk USA dan UK, tetapi bukan Jerman. Hasilnya mempertahankan MultiIndex dalam DataFrame yang dikembalikan.
import pandas as pd
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]
})
df = df_flat.set_index(['country', 'year']).sort_index()
# Select specific (country, year) combinations
subset = df.loc[[('USA', 2022), ('UK', 2023), ('DE', 2022)]]
print(subset)Melakukan Slicing dengan pd.IndexSlice
pd.IndexSlice (umumnya diberi alias idx) memungkinkan Anda menulis irisan rentang untuk tingkat MultiIndex tanpa menyusun irisan tuple yang panjang secara manual. Sintaks: df.loc[idx[outer_slice, inner_slice], column_slice]. Misalnya, df.loc[idx['UK':'USA', 2022:2023], :] memilih semua baris dengan tingkat terluar antara UK dan USA serta tingkat terdalam antara 2022 dan 2023. Indeks harus diurutkan agar ini berfungsi dengan benar.
import pandas as pd
import numpy as np
years = [2021, 2022, 2023]
countries = ['DE', 'UK', 'USA']
mi = pd.MultiIndex.from_product([countries, years], names=['country', 'year'])
df = pd.DataFrame({'gdp': np.random.randint(3000, 26000, 9)}, index=mi)
idx = pd.IndexSlice
# Select UK and USA for years 2022 and 2023
subset = df.loc[idx['UK':'USA', 2022:2023], :]
print(subset)Mengakses Irisan Silang dengan .xs()
df.xs(key, level=) memilih semua baris yang memiliki tingkat tertentu sama dengan nilai yang diberikan, terlepas dari isi tingkat lainnya. Berbeda dengan .loc yang mengharuskan Anda menentukan tingkat terluar terlebih dahulu, .xs dapat langsung mengakses tingkat mana pun berdasarkan namanya. Misalnya, df.xs(2022, level='year') mengembalikan semua baris tahun 2022 dari semua negara tanpa perlu menentukan 'USA', 'UK', atau 'DE'.
import pandas as pd
import numpy as np
countries = ['DE', 'UK', 'USA']
years = [2021, 2022, 2023]
mi = pd.MultiIndex.from_product([countries, years], names=['country', 'year'])
df = pd.DataFrame({'gdp': [4100,4200,4350, 3000,3100,3200, 23000,25000,26000]}, index=mi)
# All countries for year 2022 (inner level)
print('All data for year 2022:')
print(df.xs(2022, level='year'))
# All years for UK (outer level)
print('\nAll years for UK:')
print(df.xs('UK', level='country'))Mengakses Kolom MultiIndex
Jika DataFrame memiliki MultiIndex pada kolom, gunakan tuple untuk mengakses kolom tertentu: df[('revenue', 'Q1')]. Untuk memilih semua kolom pada tingkat terluar (misalnya semua kolom pendapatan), gunakan df['revenue'] yang mengembalikan DataFrame berisi semua kolom tingkat terdalam di bawah kunci terluar tersebut. Pola pd.IndexSlice juga berfungsi pada multi-indeks kolom jika dipadukan dengan .loc.
import pandas as pd
import numpy as np
metrics = ['revenue', 'cost']
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
cols = pd.MultiIndex.from_product([metrics, quarters], names=['metric', 'quarter'])
df = pd.DataFrame(
np.random.randint(50, 200, (3, 8)),
columns=cols,
index=['USA', 'UK', 'DE']
)
# Access all revenue columns
print('Revenue columns:')
print(df['revenue'])
# Access a specific cell
print('\nUSA revenue Q1:', df.loc['USA', ('revenue', 'Q1')])Memilih Tingkat Terdalam di Semua Kunci Terluar
Untuk memilih satu nilai tingkat terdalam di semua nilai tingkat terluar, padukan .loc dengan slice(None) untuk tingkat terluar: df.loc[(slice(None), 2022), :]. Ini memilih baris tahun 2022 dari setiap negara. Versi pd.IndexSlice lebih mudah dibaca: df.loc[idx[:, 2022], :]. Pola ini sering diperlukan ketika Anda ingin mengambil gambaran semua entitas pada titik waktu tertentu.
import pandas as pd
import numpy as np
countries = ['DE', 'UK', 'USA']
years = [2021, 2022, 2023]
mi = pd.MultiIndex.from_product([countries, years], names=['country', 'year'])
df = pd.DataFrame({'gdp': [4100,4200,4350, 3000,3100,3200, 23000,25000,26000]}, index=mi)
idx = pd.IndexSlice
# All countries for year 2022 (using IndexSlice)
all_2022 = df.loc[idx[:, 2022], :]
print('All countries in 2022:')
print(all_2022)Kesalahan Umum dalam Pemilihan MultiIndex
Tiga kesalahan umum: 1) Indeks tidak terurut: melakukan slicing pada MultiIndex yang tidak diurutkan akan memunculkan UnsortedIndexError atau menghasilkan hasil yang salah — selalu panggil sort_index() terlebih dahulu. 2) KeyError dengan tuple sebagai kunci: jika Anda memberikan tuple tanpa membungkusnya dalam .loc[], Python menafsirkannya sebagai pengindeksan berdasarkan posisi — selalu gunakan .loc untuk mengakses MultiIndex berdasarkan label. 3) Ketidaksesuaian tingkat: setelah groupby, nama tingkat MultiIndex mungkin tidak sesuai dengan yang Anda harapkan — periksa df.index.names sebelum melakukan slicing.
import pandas as pd
# Unsorted MultiIndex slicing
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)
# Sort before slicing
df = df.sort_index()
print('After sort:', df.index.is_monotonic_increasing)
idx = pd.IndexSlice
print('\nSlice A:')
print(df.loc[idx['A', :], :])Contoh Praktis: Pelaporan Kuartalan
Contoh penggunaan konkret: Anda memiliki data penjualan yang diindeks berdasarkan (wilayah, kuartal) dan perlu mengambil Q4 dari semua wilayah untuk laporan akhir tahun. Gunakan .xs('Q4', level='quarter') untuk mendapatkan irisan silang ini dalam satu pemanggilan. Lalu hitung totalnya dengan .sum(). Pola ini — agregasi groupby → hasil MultiIndex → ekstraksi irisan silang — sangat umum dalam alur kerja pelaporan bisnis.
import pandas as pd
import numpy as np
regions = ['North', 'South', 'East', 'West']
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
mi = pd.MultiIndex.from_product([regions, quarters], names=['region', 'quarter'])
np.random.seed(42)
df = pd.DataFrame({
'sales': np.random.randint(200, 500, 16),
'units': np.random.randint(50, 150, 16)
}, index=mi)
# Extract Q4 performance across all regions
q4 = df.xs('Q4', level='quarter')
print('Q4 Results by Region:')
print(q4)
print('\nQ4 Total Sales:', q4['sales'].sum())Menggabungkan Pemilihan MultiIndex dengan Kolom
Anda dapat memilih baris dan kolom tertentu secara bersamaan menggunakan .loc[row_indexer, column_list]. Dengan MultiIndex, pengindeks baris berupa tuple, daftar tuple, atau IndexSlice, sedangkan pengindeks kolom berupa nama kolom atau daftar nama. Dengan demikian, Anda dapat mengekstrak sub-tabel persegi panjang yang tepat dari DataFrame hierarkis dalam satu ekspresi.
import pandas as pd
import numpy as np
countries = ['DE', 'UK', 'USA']
years = [2021, 2022, 2023]
mi = pd.MultiIndex.from_product([countries, years], names=['country', 'year'])
df = pd.DataFrame({
'gdp': [4100,4200,4350, 3000,3100,3200, 23000,25000,26000],
'inflation': [1.5, 2.1, 2.8, 2.0, 3.4, 2.9, 3.2, 5.1, 4.8],
'unemployment': [5.0, 4.8, 4.5, 4.5, 4.2, 4.0, 3.8, 3.5, 3.3]
}, index=mi)
idx = pd.IndexSlice
# UK and USA, years 2022-2023, only gdp and inflation
result = df.loc[idx['UK':'USA', 2022:2023], ['gdp', 'inflation']]
print(result)Pemeriksaan Singkat
Uji pemahaman Anda tentang pemilihan MultiIndex dari pelajaran ini.
Ringkasan Pelajaran
Dalam pelajaran ini Anda mempelajari: gunakan .loc dengan tuple untuk memilih kombinasi label (terluar, terdalam) tertentu, pd.IndexSlice untuk irisan rentang pada tingkat mana pun, dan .xs() untuk mengekstrak irisan silang pada tingkat mana pun, terlepas dari kunci terluarnya. Selalu urutkan indeks terlebih dahulu untuk menghindari UnsortedIndexError. Selanjutnya kita akan mempelajari penyelarasan indeks dan pengindeksan ulang — cara Pandas menyelaraskan dua DataFrame ke indeks yang sama.
Belajar Python dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Memilih Data dari MultiIndex” gratis?
Ya — teks lengkap “Memilih Data dari MultiIndex” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Pandas & NumPy Academy, upgrade ke CoddyKit PRO. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Memilih Data dari MultiIndex”?
Ambil data pada tingkat indeks luar dan dalam menggunakan .loc dengan tupel, irisan, dan pembantu pd.IndexSlice. Kamu berlatih Pandas & NumPy Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Pandas & NumPy Academy?
Tidak diperlukan pengalaman sebelumnya. Pandas & NumPy Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Memilih Data dari MultiIndex” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Pandas & NumPy Academy ini?
Ya. Setiap pelajaran Pandas & NumPy Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Membuat MultiIndex
- Memilih Data dari MultiIndex
- Penyelarasan dan Pengindeksan Ulang
- Manfaat Kinerja Indeks Terurut