การเลือกข้อมูลจาก 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การสร้าง MultiIndex
- การเลือกข้อมูลจาก MultiIndex
- การจัดแนวดัชนีและการสร้างดัชนีใหม่
- ประโยชน์ด้านประสิทธิภาพของดัชนีที่เรียงแล้ว