เมธอด 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 = บนสุด) |
dropna | True | True = ลบ 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