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

การสร้าง MultiIndex

สร้างดัชนีแถวแบบลำดับชั้นด้วย pd.MultiIndex.from_tuples หรือ set_index บนหลายคอลัมน์ และตรวจสอบระดับของดัชนี

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

MultiIndex คืออะไร

MultiIndex (หรือเรียกว่าดัชนีแบบลำดับชั้น) ช่วยให้ DataFrame หรือ Series ของ Pandas มี ป้ายกำกับแถวหลายระดับ ลองนึกภาพว่าเป็นคีย์ประกอบในฐานข้อมูล แทนที่จะระบุแถวด้วยป้ายกำกับเดียว คุณจะระบุด้วยทูเพิล เช่น (ประเทศ, เมือง) หรือ (ปี, ไตรมาส) MultiIndexes มีความสำคัญต่อการแสดงข้อมูลแบบพาเนล อนุกรมเวลาแบบภาคตัดขวาง และชุดข้อมูลใด ๆ ที่มีโครงสร้างการจัดกลุ่มตามธรรมชาติสองระดับ

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)

การสร้าง MultiIndex ด้วย from_tuples

pd.MultiIndex.from_tuples(list_of_tuples, names=) เป็นวิธีที่ชัดเจนที่สุดในการสร้าง MultiIndex ทูเพิลแต่ละรายการจะกลายเป็นป้ายกำกับแถวหนึ่งรายการ และองค์ประกอบของทูเพิลจะกลายเป็นระดับต่าง ๆ พารามิเตอร์ names ใช้กำหนดป้ายกำกับให้แต่ละระดับ (เช่น ['year', 'quarter']) วิธีนี้เหมาะเมื่อคุณมีรายการคีย์ประกอบที่สร้างไว้ล่วงหน้าและต้องการใช้เป็นดัชนีแถว

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)

การสร้าง MultiIndex ด้วย from_product

pd.MultiIndex.from_product(iterables, names=) สร้าง MultiIndex จาก ผลคูณคาร์ทีเซียน ของรายการหลายรายการ ซึ่งหมายถึงทุกชุดผสมขององค์ประกอบจากรายการนำเข้า วิธีนี้สะดวกที่สุดเมื่อข้อมูลควรมีชุดผสมของระดับต่าง ๆ ครบทั้งหมด ตัวอย่างเช่น ชุดผสมทั้งหมดของ 3 ปี × 4 ไตรมาส × 5 ภูมิภาค จะสร้างข้อมูลพาเนลแบบสมดุลจำนวน 60 แถวโดยอัตโนมัติ

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

การสร้าง MultiIndex ด้วย set_index

วิธีสร้าง MultiIndex ที่ใช้บ่อยที่สุดในทางปฏิบัติคือ เริ่มจาก DataFrame ปกติที่มีคอลัมน์สำหรับจัดกลุ่ม จากนั้นเรียกใช้ df.set_index([col1, col2]) การดำเนินการนี้จะยกระดับคอลัมน์เหล่านั้นจากคอลัมน์ข้อมูลให้กลายเป็นระดับของดัชนี ผลลัพธ์เหมือนกับการสร้างดัชนีตั้งแต่ต้นด้วย from_tuples แต่ใช้เพียงบรรทัดเดียวเมื่อเริ่มจากข้อมูลแบบตาราง

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)

การตรวจสอบระดับของ MultiIndex

MultiIndex จัดเก็บข้อมูลไว้ใน ระดับ (ค่าที่ไม่ซ้ำกันในแต่ละระดับ) และ รหัส (ตัวชี้จำนวนเต็มไปยังอาร์เรย์ของระดับ) ตรวจสอบระดับด้วย df.index.levels หรือ df.index.get_level_values(level) ใช้ df.index.nlevels เพื่อตรวจสอบว่ามีกี่ระดับ แอตทริบิวต์ names จะแสดงชื่อที่กำหนดให้แต่ละระดับ — ตั้งชื่อเหล่านี้ด้วย 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 บนคอลัมน์

สามารถใช้ MultiIndex กับ คอลัมน์ ได้เช่นกัน เพื่อสร้างลำดับชั้นของป้ายกำกับคอลัมน์ วิธีนี้พบได้บ่อยเมื่อจัดเก็บตัวชี้วัดหลายรายการสำหรับแต่ละหมวดหมู่ในรูปแบบคล้ายตารางไพวอต เช่น (รายได้, Q1), (รายได้, Q2), (ต้นทุน, Q1), (ต้นทุน, Q2) เข้าถึงคอลัมน์ด้วย MultiIndex ในลักษณะเดียวกับการเข้าถึงแถว โดยใช้ทูเพิล สร้าง MultiIndex ของคอลัมน์ด้วย pd.MultiIndex.from_product แล้วกำหนดให้กับ 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 หลังการรวมกลุ่มด้วย GroupBy

เมื่อเรียกใช้ groupby([col1, col2]).agg(...) DataFrame ที่ได้จะมี MultiIndex บนแถว (คีย์ groupby สองตัวจะกลายเป็นระดับดัชนีสองระดับ) และอาจมี MultiIndex บนคอลัมน์ด้วย (หากรวมตัวชี้วัดหลายรายการ) นี่เป็นวิธีที่พบบ่อยที่สุดในการพบ MultiIndex ในการวิเคราะห์ข้อมูลประจำวัน — การเข้าใจวิธีใช้งานจึงเป็นสิ่งจำเป็นสำหรับการทำงานกับผลลัพธ์จาก 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)

การสลับและจัดเรียงระดับใหม่

ใช้ df.swaplevel() เพื่อสลับระดับดัชนีสองระดับ และใช้ df.reorder_levels([...]) เพื่อเปลี่ยนลำดับของทุกระดับ การจัดเรียงใหม่มีประโยชน์เมื่อคุณต้องการเลือกข้อมูลโดยเริ่มจากระดับด้านใน หรือเมื่อ DataFrame สองรายการมีลำดับระดับดัชนีต่างกันและจำเป็นต้องจัดให้ตรงกันก่อนรวมข้อมูล หลังจัดเรียงใหม่ ให้เรียกใช้ sort_index() เสมอเพื่อคืนลำดับตามพจนานุกรมและให้การเลือกข้อมูลบางส่วนมีประสิทธิภาพ

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

การตรวจสอบและจัดเรียง MultiIndex

การเลือกข้อมูลบางส่วนจาก MultiIndex จะมีประสิทธิภาพก็ต่อเมื่อดัชนี เรียงตามลำดับพจนานุกรม ตรวจสอบว่าดัชนีเรียงลำดับแล้วหรือไม่ด้วย df.index.is_monotonic_increasing หากผลลัพธ์เป็น False ให้จัดเรียงด้วย df.sort_index() MultiIndex ที่ไม่ได้เรียงลำดับจะทำให้เกิด PerformanceWarning ในการดำเนินการเลือกข้อมูลบางส่วน และอาจให้ผลลัพธ์ไม่ถูกต้องในกรณีขอบบางอย่าง — ควรจัดเรียงเสมอหลังสร้างหรือแก้ไข 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)

การรีเซ็ต MultiIndex ให้เป็นคอลัมน์

เรียกใช้ df.reset_index() เพื่อแปลงระดับดัชนีทั้งหมดกลับเป็นคอลัมน์ปกติ โดยให้ DataFrame มี RangeIndex แบบจำนวนเต็มทั่วไป รูปแบบนี้พบได้บ่อยหลังการรวมข้อมูลด้วย groupby: คำนวณสรุปข้อมูลที่จัดกลุ่มแล้วด้วย MultiIndex จากนั้นรีเซ็ตดัชนีเพื่อให้ได้ DataFrame แบบแบน ซึ่งเหมาะสำหรับการดำเนินการเพิ่มเติมใน Pandas การผสานข้อมูล หรือการส่งออกเป็น CSV ใช้ reset_index(level='name') เพื่อรีเซ็ตเพียงระดับเดียวของดัชนีสองระดับ

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

ควรใช้ MultiIndex เมื่อใด

ใช้ MultiIndex เมื่อข้อมูลของคุณมีโครงสร้างลำดับชั้นตามธรรมชาติ เช่น อนุกรมเวลาที่มีความละเอียดระดับย่อยภายในวัน (วันที่ + ชั่วโมง) ข้อมูลแบบแผง (เอนทิตี + ช่วงเวลา) หรือการจัดกลุ่มซ้อนกัน (ประเทศ + ภูมิภาค + เมือง) หลีกเลี่ยง MultiIndexes สำหรับคีย์การจัดกลุ่มสองคอลัมน์แบบเรียบง่าย ซึ่ง DataFrame แบบแบนที่มีคอลัมน์แยกกันอ่านเข้าใจได้พอ ๆ กัน หากคุณพบว่าต้องเรียกใช้ reset_index() อยู่ตลอดเพียงเพื่อเข้าถึงข้อมูล นั่นเป็นสัญญาณว่า MultiIndex ไม่ได้เพิ่มประโยชน์ให้กับกระบวนการทำงานของคุณ

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

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

สรุปบทเรียน

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

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

บทเรียน “การสร้าง MultiIndex” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การสร้าง MultiIndex”

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

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

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

บทเรียน “การสร้าง MultiIndex” ใช้เวลานานแค่ไหน

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

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

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

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

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