Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python - Stack คอลัมน์หลายระดับ (Multi-level Columns) ใน Pandas DataFrame

เมธอด stack() ใช้ย้ายระดับในคอลัมน์ (column level) ไปเป็นแถว (row level) ทำให้ MultiIndex Columns กลายเป็น MultiIndex Rows (Hierarchical Index) เหมาะสำหรับ Reshape ข้อมูลจาก Wide เป็น Long format

ขั้นตอนการทำงาน

1. สร้าง MultiIndex Columns

import pandas as pd

items = pd.MultiIndex.from_tuples([
    ('Maths', 'Mental Maths'),
    ('Maths', 'Discrete Mathematics'),
    ('Maths', 'Applied Mathematics')
])

2. สร้าง DataFrame พร้อม MultiIndex Columns

dataFrame = pd.DataFrame(
    [[67, 86, 78], [56, 92, 97], [92, 95, 91]],
    index=['John', 'Tom', 'Henry'],
    columns=items
)

3. ใช้ stack() ย้ายระดับคอลัมน์ล่างสุด (level=-1) ไปเป็นแถว

stacked = dataFrame.stack()
print(stacked)

โค้ดตัวอย่างสมบูรณ์

import pandas as pd

# Multi-level columns
items = pd.MultiIndex.from_tuples([
    ('Maths', 'Mental Maths'),
    ('Maths', 'Discrete Mathematics'),
    ('Maths', 'Applied Mathematics')
])

# DataFrame
dataFrame = pd.DataFrame(
    [[67, 86, 78], [56, 92, 97], [92, 95, 91]],
    index=['John', 'Tom', 'Henry'],
    columns=items
)
print("DataFrame:\n", dataFrame)

# Stack
print("\nStacked:\n", dataFrame.stack())

ผลลัพธ์

DataFrame:
        Maths
        Mental Maths  Discrete Mathematics  Applied Mathematics
John           67                    86                   78
Tom            56                    92                   97
Henry          92                    95                   91

Stacked:
              Maths
John Mental Maths             67
     Discrete Mathematics     86
     Applied Mathematics      78
Tom  Mental Maths             56
     Discrete Mathematics     92
     Applied Mathematics      97
Henry Mental Maths             92
     Discrete Mathematics     95
     Applied Mathematics      91

คำอธิบาย

  • stack() ย้าย level -1 (innermost column level) ไปเป็น row level ใหม่
  • ผลลัพธ์เป็น Series พร้อม MultiIndex (Student, Subject)
  • ค่า NaN จะถูก drop ออก (default dropna=True)

พารามิเตอร์ stack()

พารามิเตอร์ค่าเริ่มต้นคำอธิบาย
level-1ระดับที่จะ stack (-1 = ล่างสุด, 0 = บนสุด)
dropnaTrueTrue = ลบ NaN, False = เก็บ NaN ไว้

ตัวอย่าง Stack Level อื่น

# Stack level 0 (ระดับบนสุด: Maths)
df.stack(level=0)

# Stack ทุกระดับ (หลายครั้ง)
df.stack().stack()

# Stack พร้อมเก็บ NaN
df.stack(dropna=False)

คู่คู่: unstack() (ย้อนกลับ)

# จาก stacked กลับเป็น wide
stacked.unstack()           # ย้อน level -1
stacked.unstack(level=0)    # ย้อน level 0
stacked.unstack(level='Subject')  # ใช้ชื่อ level

การใช้งานจริง: Pivot Table → Stack

# Pivot table แล้ว stack
pivot = df.pivot_table(index='Student', columns='Subject', values='Score')
stacked = pivot.stack()  # กลายเป็น Series (Student, Subject) -> Score