0Pricing
Pandas & NumPy Academy · บทเรียน

การเลือกข้อมูลจาก MultiIndex

ดึงข้อมูลจากระดับดัชนีภายนอกและภายในด้วย .loc โดยใช้ทูเพิล ช่วงข้อมูล และตัวช่วย pd.IndexSlice

การเลือกข้อมูลจาก MultiIndex เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

การนำทางข้อมูลแบบลำดับชั้น

เมื่อมี MultiIndex แล้ว คุณจำเป็นต้องมีวิธีที่มีประสิทธิภาพในการดึงข้อมูลบางส่วน Pandas มีเครื่องมือสามอย่างสำหรับงานนี้ ได้แก่ .loc กับทูเพิลสำหรับเลือกป้ายกำกับที่ตรงกันทุกประการ slice() และ pd.IndexSliceสำหรับเลือกช่วงข้ามระดับ และ .xs()สำหรับเลือกส่วนตัดขวางตามค่าของระดับที่ระบุ การทำความเข้าใจรูปแบบการเข้าถึงเหล่านี้จะช่วยให้คุณใช้ประโยชน์จากการทำดัชนีแบบลำดับชั้นได้อย่างเต็มที่

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)

การเลือกตามระดับนอกด้วย .loc

ส่งป้ายกำกับระดับนอกเพียงรายการเดียวให้กับ .loc[] เพื่อดึงแถวทั้งหมดของกลุ่มนั้น สำหรับ MultiIndex สองระดับ (ประเทศ, ปี) df.loc['USA'] จะส่งคืนแถวทั้งหมดของ USA เป็น DataFrame โดยเหลือเพียงดัชนีระดับใน (ปี) พฤติกรรมนี้เรียกว่าการลบระดับ — เมื่อคุณเลือกค่าเฉพาะในระดับนอก Pandas จะลบระดับนั้นออกจากดัชนีของออบเจกต์ที่ส่งคืน

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)

การเลือกทูเพิลเฉพาะด้วย .loc

หากต้องการดึงแถวเดียวที่ระบุด้วยดัชนีทั้งสองระดับ ให้ส่งทูเพิลให้กับ .loc[]: df.loc[('USA', 2022)] การดำเนินการนี้จะส่งคืน Series (หรือค่าสเกลาร์หากเลือกคอลัมน์เดียว) ที่ตรงกับชุดป้ายกำกับ (ระดับนอก, ระดับใน) นั้นพอดี คุณต้องใส่ทูเพิลไว้ภายในลิสต์ df.loc[[('USA', 2022)]] หากต้องการให้ผลลัพธ์เป็น DataFrame แทนที่จะเป็น 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)]])

การเลือกหลายแถวด้วยลิสต์ของทูเพิล

หากต้องการเลือกหลายแถวที่ระบุอย่างเฉพาะเจาะจงพร้อมกัน ให้ส่งลิสต์ของทูเพิลให้กับ .loc[] วิธีนี้มีประโยชน์เมื่อต้องการเลือกแถวบางส่วนที่ไม่ต่อเนื่องกันและระบุด้วยคีย์ประกอบ เช่น ข้อมูลปี 2022 ของ USA และ UK แต่ไม่ใช่ Germany ผลลัพธ์จะคง MultiIndex ไว้ใน DataFrame ที่ส่งคืน

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)

การเลือกช่วงด้วย pd.IndexSlice

pd.IndexSlice (มักกำหนดชื่อย่อเป็น idx) ช่วยให้คุณเขียนการเลือกช่วงสำหรับระดับของ MultiIndex ได้ โดยไม่ต้องสร้างทูเพิลสำหรับช่วงที่ยืดยาวด้วยตนเอง ไวยากรณ์คือ df.loc[idx[outer_slice, inner_slice], column_slice] ตัวอย่างเช่น df.loc[idx['UK':'USA', 2022:2023], :] จะเลือกแถวทั้งหมดที่ระดับนอกอยู่ระหว่าง UK ถึง USA และระดับในอยู่ระหว่าง 2022 ถึง 2023 ดัชนีต้องถูกจัดเรียงเพื่อให้การดำเนินการนี้ทำงานได้อย่างถูกต้อง

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)

การเข้าถึงส่วนตัดขวางด้วย .xs()

df.xs(key, level=) จะเลือกแถวทั้งหมดที่ระดับเฉพาะมีค่าเท่ากับค่าที่กำหนด โดยไม่ขึ้นกับว่าระดับอื่นมีค่าอะไร ต่างจาก .loc ที่ต้องระบุระดับนอกก่อน .xs สามารถเข้าถึงระดับใดก็ได้โดยตรงด้วยชื่อระดับนั้น ตัวอย่างเช่น df.xs(2022, level='year') จะส่งคืนแถวทั้งหมดของปี 2022 จากทุกประเทศ โดยไม่ต้องระบุ 'USA', 'UK' หรือ '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'))

การเข้าถึงคอลัมน์แบบ MultiIndex

เมื่อ DataFrame มีMultiIndex บนคอลัมน์ ให้ใช้ทูเพิลเพื่อเข้าถึงคอลัมน์ที่ต้องการ: df[('revenue', 'Q1')] หากต้องการเลือกคอลัมน์ทั้งหมดในระดับนอก (เช่น คอลัมน์รายรับทั้งหมด) ให้ใช้ df['revenue'] ซึ่งจะส่งคืน DataFrame ที่มีคอลัมน์ระดับในทั้งหมดภายใต้คีย์ระดับนอกนั้น รูปแบบการใช้ pd.IndexSlice ก็ใช้กับดัชนีหลายระดับของคอลัมน์ได้เช่นกันเมื่อใช้ร่วมกับ .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')])

การเลือกระดับในจากคีย์ระดับนอกทั้งหมด

หากต้องการเลือกค่าเดียวของระดับในจากค่าระดับนอกทั้งหมด ให้ใช้ .loc ร่วมกับ slice(None) สำหรับระดับนอก: df.loc[(slice(None), 2022), :] การดำเนินการนี้จะเลือกแถวปี 2022 ของทุกประเทศ รูปแบบที่ใช้ pd.IndexSlice อ่านเข้าใจได้ง่ายกว่า: df.loc[idx[:, 2022], :] รูปแบบนี้มักจำเป็นเมื่อต้องการดึงภาพรวมของทุกเอนทิตี ณ จุดเวลาที่ระบุ

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)

ข้อผิดพลาดที่พบบ่อยในการเลือกด้วย MultiIndex

ข้อผิดพลาดที่พบบ่อยมีสามประการ: 1) ดัชนีไม่ถูกจัดเรียง: การเลือกช่วงจาก MultiIndex ที่ไม่ได้จัดเรียงจะทำให้เกิด UnsortedIndexError หรือส่งคืนผลลัพธ์ที่ไม่ถูกต้อง — ให้เรียกใช้ sort_index() ก่อนเสมอ 2) KeyError เมื่อใช้ทูเพิลเป็นคีย์: หากส่งทูเพิลโดยไม่ครอบด้วย .loc[] Python จะตีความว่าเป็นการทำดัชนีตามตำแหน่ง — ให้ใช้ .loc สำหรับการเข้าถึง MultiIndex ตามป้ายกำกับเสมอ 3) ระดับไม่ตรงกัน: หลังใช้ groupby ชื่อระดับของ MultiIndex อาจไม่ตรงกับที่คาดไว้ — ตรวจสอบ df.index.names ก่อนเลือกช่วง

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', :], :])

ตัวอย่างเชิงปฏิบัติ: การจัดทำรายงานรายไตรมาส

กรณีใช้งานที่เป็นรูปธรรมคือ คุณมีข้อมูลยอดขายที่จัดทำดัชนีตาม (ภูมิภาค, ไตรมาส) และต้องการดึงข้อมูล Q4 จากทุกภูมิภาคสำหรับรายงานสิ้นปี ใช้ .xs('Q4', level='quarter') เพื่อรับส่วนตัดขวางนี้ด้วยการเรียกใช้เพียงครั้งเดียว จากนั้นคำนวณยอดรวมด้วย .sum() รูปแบบนี้ — การรวมกลุ่ม → ผลลัพธ์แบบ MultiIndex → การดึงส่วนตัดขวาง — พบได้บ่อยมากในกระบวนการทำงานด้านการรายงานธุรกิจ

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())

การรวมการเลือกด้วย MultiIndex เข้ากับคอลัมน์

คุณสามารถเลือกแถวและคอลัมน์ที่ต้องการพร้อมกันได้โดยใช้ .loc[row_indexer, column_list] สำหรับ MultiIndex ตัวระบุแถวอาจเป็นทูเพิล ลิสต์ของทูเพิล หรือ IndexSlice ส่วนตัวระบุคอลัมน์อาจเป็นชื่อคอลัมน์หรือลิสต์ของชื่อคอลัมน์ วิธีนี้ช่วยให้คุณดึงตารางย่อยรูปสี่เหลี่ยมที่ต้องการจาก DataFrame แบบลำดับชั้นได้ด้วยนิพจน์เดียว

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)

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจเกี่ยวกับการเลือกด้วย MultiIndex จากบทเรียนนี้

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่าให้ใช้ .loc กับทูเพิลเพื่อเลือกชุดป้ายกำกับ (ระดับนอก, ระดับใน) ที่ต้องการ ใช้ pd.IndexSlice สำหรับการเลือกช่วงข้ามระดับใดก็ได้ และใช้ .xs() เพื่อดึงส่วนตัดขวางที่ระดับใดก็ได้โดยไม่ขึ้นกับคีย์ระดับนอก ให้จัดเรียงดัชนีก่อนเสมอเพื่อหลีกเลี่ยง UnsortedIndexError ต่อไปเราจะสำรวจการจัดแนวดัชนีและการทำดัชนีใหม่ — วิธีที่ Pandas จัดแนว DataFrames สองรายการให้ใช้ดัชนีร่วมกัน

คำถามที่พบบ่อย

บทเรียน “การเลือกข้อมูลจาก MultiIndex” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การเลือกข้อมูลจาก MultiIndex” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การเลือกข้อมูลจาก MultiIndex”

ดึงข้อมูลจากระดับดัชนีภายนอกและภายในด้วย .loc โดยใช้ทูเพิล ช่วงข้อมูล และตัวช่วย pd.IndexSlice คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การเลือกข้อมูลจาก MultiIndex” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม

ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การสร้าง MultiIndex
  2. การเลือกข้อมูลจาก MultiIndex
  3. การจัดแนวดัชนีและการสร้างดัชนีใหม่
  4. ประโยชน์ด้านประสิทธิภาพของดัชนีที่เรียงแล้ว
← กลับไปที่ Pandas & NumPy Academy