บทนำ
Pandas มีความสามารถในการเลือกข้อมูลย่อย (Subset Selection) สองวิธี ได้แก่ ด้วยตำแหน่งดัชนี (Index Position) และด้วยฉลากดัชนี (Index Labels) บทความนี้จะสาธิตวิธี "Select a Subset Of Data Using lexicographical slicing" หรือการตัดข้อมูลแบบเล็กซิโคกราฟิกอล
ข้อมูลตัวอย่างใช้ Movies Dataset จาก Kaggle
ขั้นตอนการทำงาน
1. นำเข้าข้อมูลภาพยนตร์พร้อมคอลัมน์ที่จำเป็น
import pandas as pd
import numpy as np
movies = pd.read_csv("https://raw.githubusercontent.com/sasankac/TestDataSet/master/movies_data.csv",
index_col="title",
usecols=["title", "budget", "vote_average", "vote_count"])
movies.sample(n=5)
2. เรียงลำดับดัชนี (แนะนำเป็นอย่างยิ่ง)
หากดัชนีเป็นสตริง ควรเรียงลำดับก่อน เพื่อประสิทธิภาพที่ดีขึ้น โดยเฉพาะข้อมูลขนาดใหญ่
เกิดอะไรขึ้นถ้าไม่เรียงดัชนี?
Pandas จะต้องตรวจสอบทุกลายเบลทีละตัว (Linear Scan) ซึ่งช้า มากกว่าการใช้ Binary Search บนดัชนีที่เรียงแล้ว
# ตรวจสอบว่าดัชนีเรียงแล้วหรือยัง movies.index.is_monotonic # False
3. ลองเลือกหนังที่ขึ้นต้นด้วย A% (เหมือน SQL: WHERE title LIKE 'A%')
movies.loc["Aa":"Bb"]
ผลลัพธ์: ValueError: index must be monotonic increasing or decreasing เพราะดัชนีไม่ได้เรียง
4. เรียงดัชนีแบบออสเซนดิงแล้วลองใหม่
movies.sort_index(inplace=True) movies.loc["Aa":"Bb"]
ตอนนี้ทำงานได้แล้ว - ได้หนังที่ขึ้นต้นด้วย A ถึง B
5. การตัดแบบย้อนกลับ (Reverse Slicing)
หากดัชนีเรียงแบบดีเซนดิง ต้องสลับลำดับ start และ stop
movies.sort_index(ascending=False, inplace=True) movies.loc["Bb":"Aa"] # ต้องสลับลำดับ
Lexicographical Slicing ใน Pandas ทำงานได้เฉพาะเมื่อดัชนีเรียงลำดับแล้วเท่านั้น