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

Python Pandas: Stack คอลัมน์ Single-Level ด้วย stack()

บทนำ

เมธอด stack() ใน Pandas ใช้ "พับ" คอลัมน์ (columns) ให้กลายเป็นแถว (rows) สร้าง MultiIndex ในแถว เหมาะสำหรับเปลี่ยนข้อมูลจาก wide format เป็น long format

ตัวอย่างพื้นฐาน


import pandas as pd

# DataFrame คอลัมน์เดี่ยว (single-level columns)
df = pd.DataFrame(
    [[10, 15], [20, 25], [30, 35], [40, 45]],
    index=['w', 'x', 'y', 'z'],
    columns=['a', 'b']
)

print("DataFrame ต้นทาง (Wide format):")
print(df)

# Stack: คอลัมน์ a,b กลายเป็นระดับที่ 2 ของ index
stacked = df.stack()
print("\nหลัง stack() (Long format):")
print(stacked)
print(f"\nType: {type(stacked)}")  # Series
print(f"Index: {stacked.index.tolist()}")

ผลลัพธ์


DataFrame ต้นทาง (Wide format):
    a   b
w  10  15
x  20  25
y  30  35
z  40  45

หลัง stack() (Long format):
w  a    10
   b    15
x  a    20
   b    25
y  a    30
   b    35
z  a    40
   b    45
dtype: int64

พารามิเตอร์สำคัญ

การใช้งานกับ MultiIndex Columns


# DataFrame หลายระดับคอลัมน์
df_multi = pd.DataFrame(
    [[1,2,3,4], [5,6,7,8]],
    index=['x', 'y'],
    columns=pd.MultiIndex.from_tuples([
        ('A', 'a'), ('A', 'b'), ('B', 'a'), ('B', 'b')
    ])
)
print("MultiIndex Columns:")
print(df_multi)

# Stack ระดับสุดท้าย (default)
print("\nStack level=-1:")
print(df_multi.stack())

# Stack ระดับแรก
print("\nStack level=0:")
print(df_multi.stack(level=0))

คู่คู่: unstack()

การทำงานย้อนกลับ: unstack() แปลง index level กลับเป็นคอลัมน์


# ย้อนกลับ
unstacked = stacked.unstack()
print(unstacked.equals(df))  # True

กรณีใช้งานจริง

  • เตรียมข้อมูลสำหรับ plotting (seaborn/matplotlib ชอบ long format)
  • Pivot table → long format สำหรับการวิเคราะห์
  • Melting ข้อมูลสำหรับ database storage

สรุป

stack() พับคอลัมน์เป็นแถว สร้าง Series ด้วย MultiIndex คู่กับ unstack() สำหรับการแปลงรูปแบบข้อมูล Wide ↔ Long พารามิเตอร์ level ควบคุมระดับที่จะ stack, dropna ควบคุม NaN

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