Data Analyst › pandas

DataFrame พื้นฐาน

ประมาณ 25 นาที

เป้าหมายของบท

  • อ่านข้อมูลด้วย read_csv และดูโครงสร้างเบื้องต้น (shape/columns/dtypes/head/describe)
  • เลือกคอลัมน์เดียวหรือหลายคอลัมน์ และเรียงด้วย sort_values
  • สำรวจคอลัมน์ข้อความด้วย value_counts/unique

จาก SQL มาสู่ pandas

จบสาย SQL แล้ว ต่อไปนี้จะเรียนวิธีทำงานกับข้อมูลด้วยภาษา Python ผ่านไลบรารี pandas แนวคิดหลายอย่างเหมือนกับ SQL ทุกประการ (filter, group, join) แค่เปลี่ยน syntax — สายนี้จะเน้นเทียบให้เห็นความเหมือน

หน่วยข้อมูลหลักของ pandas คือ DataFrame (ตาราง 2 มิติ คล้ายตารางใน SQL) และ Series (หนึ่งคอลัมน์ของ DataFrame)

อ่านข้อมูลด้วย read_csv

import pandas as pd

products = pd.read_csv("data/products.csv")

หลังอ่านไฟล์แล้ว ควรสำรวจโครงสร้างก่อนเสมอ:

คำสั่ง บอกอะไร
products.head() ตัวอย่าง 5 แถวแรก
products.shape (จำนวนแถว, จำนวนคอลัมน์)
products.columns รายชื่อคอลัมน์
products.dtypes ชนิดข้อมูลของแต่ละคอลัมน์
products.describe() สรุปสถิติของคอลัมน์ตัวเลข (count, mean, std, min, max, …)

เลือกคอลัมน์

products['price']              # คอลัมน์เดียว → ได้ Series
products[['product_name', 'price']]   # หลายคอลัมน์ → ได้ DataFrame

เรียงข้อมูลด้วย sort_values

products.sort_values('price', ascending=False).head(5)
  • ค่าเริ่มต้นของ ascending คือ True (น้อยไปมาก) — ถ้าอยากได้มากไปน้อยต้องใส่ ascending=False เอง
  • เรียงหลายคอลัมน์ได้ด้วยการส่ง list: sort_values(['category', 'price'])
  • .nlargest(n, 'col') / .nsmallest(n, 'col') ทำสิ่งเดียวกับ sort_values().head(n) แต่สื่อความหมายชัดกว่า

สำรวจคอลัมน์ข้อความด้วย value_counts และ unique

products['category'].value_counts()   # นับจำนวนแถวของแต่ละค่า เรียงมากไปน้อยให้อัตโนมัติ
products['category'].unique()         # รายชื่อค่าที่ไม่ซ้ำ (ไม่มีตัวเลขจำนวน)

value_counts() ตอบคำถาม “ค่าไหนเยอะที่สุด” ได้ตรงๆ ส่วน unique() แค่บอกว่า “มีค่าอะไรบ้าง” — เลือกใช้ให้ตรงกับคำถาม

ตัวอย่างแก้โจทย์

กด "ขั้นต่อไป" ทีละขั้น ลองรันและแก้โค้ดในแต่ละขั้นได้

5 สินค้าราคาแพงที่สุด เรียงจากแพงไปถูก

ร้านอยากรู้ว่าสินค้าตัวไหนแพงที่สุด 5 อันดับแรก

  1. อ่านไฟล์ด้วย read_csv แล้วดูตัวอย่างข้อมูลด้วย .head()

    Python

หมวดสินค้าไหนมีสินค้าเยอะที่สุด

ทีมสินค้าอยากรู้ว่าหมวดไหนมีสินค้าในสต็อกเยอะที่สุด

  1. .value_counts() นับจำนวนแถวของแต่ละค่าที่ไม่ซ้ำในคอลัมน์ และเรียงจากมากไปน้อยให้อัตโนมัติ

    Python

เติมช่องว่าง

แทน ___ ด้วยโค้ดที่ถูกต้อง แล้วกดตรวจคำตอบ

ยังไม่ได้ทำ

หา 5 สินค้าที่ราคาถูกที่สุด แสดงคอลัมน์ product_name กับ price เก็บไว้ในตัวแปร result เติม ___ ให้ครบ

แบบฝึกท้ายบท

บทนี้จะนับว่าเสร็จเมื่อผ่านข้อพื้นฐานและประยุกต์ครบ ข้อท้าทายได้ดาวเพิ่ม

🟢 พื้นฐาน

🟢 พื้นฐานยังไม่ได้ทำ

ขนาดของตาราง orders (จำนวนแถว, จำนวนคอลัมน์) เก็บไว้ในตัวแปร orders_shape

🟢 พื้นฐานยังไม่ได้ทำ

วิธีจ่ายเงินทั้งหมดที่มีในระบบ (ไม่ซ้ำ) เรียงตามตัวอักษร เก็บเป็น list ไว้ในตัวแปร methods

🟢 พื้นฐานยังไม่ได้ทำ

5 สินค้าที่มีต้นทุน (cost) ต่ำที่สุด แสดงคอลัมน์ product_name, cost เก็บไว้ในตัวแปร result

🟢 พื้นฐานยังไม่ได้ทำ

จำนวนลูกค้าทั้งหมดในระบบ เก็บไว้ในตัวแปร n_customers

🟡 ประยุกต์

🟡 ประยุกต์ยังไม่ได้ทำ

ราคาเฉลี่ยของสินค้าทั้งหมด ปัด 2 ตำแหน่ง เก็บไว้ในตัวแปร avg_price

🟡 ประยุกต์ยังไม่ได้ทำ

3 หมวดสินค้าที่มีจำนวนสินค้ามากที่สุด (ผลจาก value_counts) เก็บไว้ในตัวแปร result

🟡 ประยุกต์ยังไม่ได้ทำ

เรียงสินค้าตามหมวดก่อน แล้วเรียงตามราคาในแต่ละหมวด (ถูกไปแพง) เอาแค่ 5 แถวแรก แสดง category, product_name, price เก็บไว้ในตัวแปร result

🔴 ท้าทาย

🔴 ท้าทายยังไม่ได้ทำ

ราคาเฉลี่ยของ 10 สินค้าที่แพงที่สุด ปัด 2 ตำแหน่ง เก็บไว้ในตัวแปร avg_top10

Quiz

1. sort_values ค่าเริ่มต้นเรียงจากน้อยไปมากหรือมากไปน้อย
2. value_counts() กับ unique() ต่างกันยังไง
3. .head(5) เทียบเท่ากับอะไร

สรุป

  • read_csv อ่านไฟล์เป็น DataFrame ดูโครงสร้างเบื้องต้นด้วย shape/columns/dtypes/head/describe
  • sort_values เรียงข้อมูล ค่าเริ่มต้นคือน้อยไปมาก (ascending=True)
  • value_counts() นับจำนวนของแต่ละค่า ต่างจาก unique() ที่ให้แค่รายชื่อค่าที่ไม่ซ้ำ

คำถามสัมภาษณ์

ได้ไฟล์ข้อมูลใหม่มาครั้งแรก ควรดูอะไรก่อนเริ่มวิเคราะห์

เริ่มจากดูภาพรวมของโครงสร้างก่อน: shape (มีกี่แถวกี่คอลัมน์), dtypes (แต่ละคอลัมน์เป็นชนิดข้อมูลอะไร), head() (ตัวอย่างข้อมูลจริง), และ describe() (สรุปสถิติของคอลัมน์ตัวเลข)

หลังจากนั้นควรเช็คคุณภาพข้อมูลคร่าวๆ ด้วย isna().sum() (มีค่าว่างไหม) และ duplicated().sum() (มีแถวซ้ำไหม) ก่อนเริ่มวิเคราะห์จริง เพื่อรู้ล่วงหน้าว่าต้องทำความสะอาดอะไรบ้าง