ข้ามไปยังเนื้อหาหลัก

บทเรียน Python pandas: คู่มือฉบับสมบูรณ์สำหรับผู้เริ่มต้น

เรียนรู้ pandas ตั้งแต่การติดตั้งจนถึงการวิเคราะห์ โดยทดสอบทุกตัวอย่างบน pandas 3.1
· 15 นาที อ่าน

สำรวจด้วย AI

pandas เป็นแพ็กเกจมาตรฐานของ Python สำหรับการวิเคราะห์ข้อมูล โดยมีการดาวน์โหลดมากกว่า 500 ล้านครั้งต่อเดือนบน PyPI รองรับการอ่านและเขียนไฟล์ CSV, Excel, JSON, SQL และฟอร์แมตอื่น ๆ อีกมากมาย และมีฟังก์ชันครอบคลุมงานประจำวันในการทำความสะอาด ปรับโครงสร้าง สรุปเชิงสถิติ และวาดกราฟข้อมูลในรูปแบบตาราง

ในบทเรียน pandas นี้ จะพาเดินผ่านเวิร์กโฟลว์ทั้งหมดด้วยข้อมูลจริงหนึ่งชุด: การติดตั้ง pandas การนำเข้าและส่งออกข้อมูล การตรวจสอบ DataFrame การเลือกและกรองแถว การจัดการค่าว่างและข้อมูลซ้ำ การผสานตาราง การคำนวณสรุปเชิงสถิติ และการวาดกราฟ ทุกตัวอย่างทำงานบน pandas 3.1 ซึ่งเป็นรุ่นปัจจุบัน และระบุจุดเปลี่ยนแปลงใน pandas 3 ที่ทำให้โค้ดจากบทเรียนเก่าบางส่วนใช้ไม่ได้

ต้องมีพื้นฐาน Python เล็กน้อยและไม่จำเป็นต้องเคยใช้ pandas มาก่อน ถ้าต้องการแผนการเรียนที่ยาวขึ้น ดูโพสต์เรื่อง วิธีเรียนรู้ pandas และสำหรับการฝึกแบบโต้ตอบ ดูคอร์ส Data Manipulation with pandas

สรุปสั้น ๆ

  • pandas เป็นไลบรารีมาตรฐานของ Python สำหรับทำงานกับข้อมูลแบบตารางใน DataFrame
  • ติดตั้งด้วย pip install pandas; pandas 3 ต้องใช้ Python 3.11 ขึ้นไป
  • เวิร์กโฟลว์หลักคือ อ่าน ตรวจสอบ เลือก ทำความสะอาด ผสาน สรุป วาดกราฟ และส่งออก
  • .loc[] เลือกตามป้ายกำกับ .iloc[] เลือกตามตำแหน่ง
  • ตั้งแต่ pandas 3 การกำหนดค่าผ่านการเชื่อมคำสั่งแบบพ่วง (chained assignment) จะไม่อัปเดตข้อมูลอีกต่อไป; ใช้คำสั่ง .loc[] ครั้งเดียว
  • กำหนดค่าผลลัพธ์ใหม่ (df = df.dropna()) แทนการใช้ inplace=True ที่เลิกใช้แล้ว

pandas คืออะไร?

pandas คือแพ็กเกจสำหรับปรับแต่งและประมวลผลข้อมูลแบบตารางใน Python กล่าวคือข้อมูลในรูปแบบแถวและคอลัมน์ หรือที่เรียกว่า DataFrame โดยสัญชาตญาณสามารถนึกภาพ DataFrame เป็นแผ่นงาน Excel ได้

ความสามารถของ pandas รวมถึงการแปลงข้อมูล เช่น การเรียงลำดับแถว และการเลือกบางส่วน การคำนวณค่าสถิติสรุปอย่างค่าเฉลี่ย การปรับรูปทรง DataFrame และการเชื่อม DataFrame เข้าด้วยกัน pandas ทำงานได้ดีกับแพ็กเกจข้อมูลของ Python อื่น ๆ ที่ได้รับความนิยม ซึ่งโดยรวมเรียกว่า PyData ecosystem ได้แก่

  • NumPy สำหรับการคำนวณเชิงตัวเลข
  • Matplotlib, Seaborn, Plotly และแพ็กเกจสำหรับการสร้างภาพข้อมูลอื่น ๆ
  • scikit-learn สำหรับการเรียนรู้ของเครื่อง

pandas ใช้ทำอะไรบ้าง?

pandas ถูกใช้ตลอดกระบวนการวิเคราะห์ข้อมูล ด้วย pandas สามารถ:

  • นำเข้าข้อมูลจากฐานข้อมูล สเปรดชีต ไฟล์ CSV และอื่น ๆ
  • ทำความสะอาดข้อมูล เช่น จัดการกับค่าว่าง
  • จัดระเบียบข้อมูลให้เป็นรูปแบบที่เหมาะสมต่อการวิเคราะห์โดยการปรับโครงสร้าง
  • สรุปข้อมูลโดยคำนวณค่าสถิติสรุป เช่น ค่าเฉลี่ยของคอลัมน์ ความสัมพันธ์ระหว่างคอลัมน์ เป็นต้น
  • สร้างภาพข้อมูลและค้นหาอินไซต์

pandas ยังมีฟังก์ชันสำหรับการวิเคราะห์อนุกรมเวลาและการวิเคราะห์ข้อมูลข้อความด้วย

ประโยชน์สำคัญของ pandas

pandas มีข้อได้เปรียบเชิงปฏิบัติสำหรับงานข้อมูลประจำวัน 5 ประการ:

  • ออกแบบมาเพื่อ Python: Python เป็นภาษาที่ได้รับความนิยมที่สุดสำหรับวิทยาการข้อมูลและการเรียนรู้ของเครื่อง ดังนั้น pandas จึงเข้ากับเครื่องมือที่ใช้อยู่แล้ว
  • ใช้โค้ดต่อหนึ่งงานน้อย: การกรอง การจัดกลุ่ม หรือการเชื่อมตารางทำได้ในบรรทัดเดียว แทนการเขียนลูป
  • มองเห็นข้อมูลได้ชัดเจน: DataFrame แสดงผลเป็นตารางมีป้ายกำกับ ทำให้เห็นได้ว่าทุกขั้นตอนทำอะไรบ้าง
  • ฟีเจอร์กว้างขวาง: ครอบคลุมการสำรวจข้อมูล ค่าว่าง ค่าสถิติสรุป การปรับรูปทรง อนุกรมเวลา และการวาดกราฟ
  • รับมือข้อมูลระดับหลายล้านแถว: pandas ทำงานกับหลายล้านแถวและหลายร้อยคอลัมน์ได้ ตราบใดที่ข้อมูลพออยู่ในหน่วยความจำ สำหรับข้อมูลที่ใหญ่กว่า เครื่องมืออย่าง Polars หรือ PySpark จะเหมาะกว่า

วิธีติดตั้ง pandas

ก่อนใช้งาน pandas ต้องติดตั้งก่อน สามารถข้ามขั้นตอนนี้ได้โดยสมัครบัญชี DataCamp ฟรี และใช้ DataLab ซึ่งเป็น IDE บนคลาวด์ที่มาพร้อม pandas (และแพ็กเกจข้อมูลของ Python ชั้นนำ) ติดตั้งไว้ล่วงหน้า

ติดตั้ง pandas

ติดตั้ง pandas ด้วยคำสั่ง pip install ในเทอร์มินัล pandas 3 ต้องใช้ Python 3.11 ขึ้นไป; หากใช้ Python รุ่นเก่า pip จะติดตั้ง pandas 2.x รุ่นล่าสุดที่รองรับ

pip install pandas

หรือจะติดตั้งผ่าน conda ก็ได้:

conda install pandas

หลังติดตั้ง pandas แล้ว ควรตรวจสอบเวอร์ชันที่ติดตั้งเพื่อยืนยันว่าทุกอย่างทำงานถูกต้อง:

import pandas as pd
print(pd.__version__)  # Prints the pandas version

ขั้นตอนนี้ยืนยันว่า pandas ติดตั้งถูกต้อง และช่วยตรวจสอบความเข้ากันได้กับแพ็กเกจอื่น

มีอะไรเปลี่ยนไปใน pandas 3.0 และ 3.1

pandas 3.0 ซึ่งออกในเดือนมกราคม 2026 เปลี่ยนวิธีทำงานของการคัดลอก สตริง และการกำหนดค่า และ pandas 3.1 (ตุลาคม 2026) เลิกใช้ inplace=True ในหลายกรณี โค้ดจากบทเรียนเก่าส่วนใหญ่ยังทำงานได้ แต่มีสี่จุดที่มักทำให้คนพลาด:

  • Copy-on-Write เป็นค่าเริ่มต้น ผลลัพธ์ของการเลือกบางส่วนหรือเมธอดจะทำงานเหมือนสำเนา ดังนั้นการแก้ไขจะไม่เปลี่ยน DataFrame ต้นฉบับอีกต่อไป SettingWithCopyWarning ถูกยกเลิกแล้ว และไม่จำเป็นต้องเรียก .copy() แบบป้องกันไว้ก่อน
  • การกำหนดค่าผ่านการเชื่อมคำสั่งแบบพ่วงใช้ไม่ได้แล้ว df["Age"][0] = 35 จะอัปเดตสำเนาชั่วคราวและไม่กระทบ df และ pandas จะแจ้งเตือนด้วย ChainedAssignmentError ให้ใช้คำสั่ง .loc[] ครั้งเดียวแทน
  • สตริงมีชนิดข้อมูลของตนเอง คอลัมน์ข้อความตอนนี้จะถูกอนุมานเป็น str แทน object และจะใช้ PyArrow หากติดตั้งไว้
  • inplace=True ถูกเลิกใช้ สำหรับ sort_values(), reset_index(), dropna(), drop_duplicates(), rename() และเมธอดอื่น ๆ อีกหลายตัว ให้กำหนดค่าผลลัพธ์ใหม่แทน: df = df.dropna()

pandas 3 เปลี่ยนค่าเริ่มต้นสี่อย่างที่ทำให้บทเรียนเก่าบางส่วนใช้ไม่ได้

ตัวอย่างการเปลี่ยนแปลงของ chained assignment บน DataFrame ขนาดเล็ก:

import pandas as pd

patients = pd.DataFrame({"name": ["Ana", "Ben", "Chloe"], "age": [34, 51, 28]})

patients["age"][0] = 35      # chained assignment: patients is not changed
patients.loc[0, "age"] = 35  # a single .loc[] call: patients is updated
print(patients.dtypes)
name      str
age     int64
dtype: object

ทุกตัวอย่างในบทเรียนนี้ปฏิบัติตามกฎของ pandas 3 สำหรับรายการเปลี่ยนแปลงทั้งหมด ดูหมายเหตุเวอร์ชันอย่างเป็นทางการของ pandas 3.0 และ pandas 3.1 หากดูแลโค้ดเก่าอยู่ ดูคู่มือเรื่อง SettingWithCopyWarning ที่อธิบายพฤติกรรมซึ่ง Copy-on-Write เข้ามาแทนที่

การนำเข้าข้อมูลใน pandas

เริ่มทำงานกับ pandas โดยนำเข้าแพ็กเกจ pandas ใน Python ตามด้านล่าง เมื่อนำเข้า pandas โดยมากจะใช้นามแฝงว่า pd.

import pandas as pd

นำเข้าไฟล์ CSV

ใช้ read_csv() พร้อมพาธไปยังไฟล์ CSV เพื่ออ่านไฟล์ comma-separated values (ดู บทเรียนการนำเข้าข้อมูลด้วย read_csv() สำหรับรายละเอียดเพิ่มเติม)

df = pd.read_csv("diabetes.csv")

การอ่านนี้จะโหลดไฟล์ diabetes.csv เข้าสู่ pandas DataFrame ชื่อ df ตลอดบทเรียนนี้ใช้ชุดข้อมูล Pima Indians Diabetes: ผู้ป่วย 768 ราย มีตัวชี้วัดสุขภาพ 8 รายการ เช่น Glucose, BMI, และ Age และคอลัมน์ Outcome ที่ค่า 1 หมายถึงได้รับการวินิจฉัยว่าเป็นเบาหวาน

นำเข้าไฟล์ข้อความ

การอ่านไฟล์ข้อความคล้ายกับไฟล์ CSV ประเด็นคือจำเป็นต้องระบุตัวคั่นด้วยอาร์กิวเมนต์ sep ตามตัวอย่างด้านล่าง ตัวคั่นคืออักขระที่คั่นค่าต่าง ๆ (คอลัมน์) ในแต่ละบรรทัด เครื่องหมายจุลภาค (sep=",") แท็บ (sep="\t") โคลอน (sep=":") และช่องว่าง (sep=r"\s+") เป็นแบบที่พบบ่อยที่สุด r"\s+" เป็นเรกูลาร์เอ็กซ์เพรสชันที่ตรงกับช่องว่างตั้งแต่หนึ่งตัวขึ้นไป; คำหน้า r ทำให้เป็นสตริงดิบ เพื่อให้ Python ไม่มองว่า \s เป็นลำดับหลบหนีที่ไม่ถูกต้อง

df = pd.read_csv("diabetes.txt", sep=r"\s+")

นำเข้าไฟล์ Excel (ชีตเดียว)

อ่านไฟล์ Excel ด้วยฟังก์ชัน read_excel() โดยใส่พาธไฟล์เป็นอินพุต pandas ต้องใช้เอนจินเสริมสำหรับ Excel: ติดตั้ง openpyxl สำหรับไฟล์ .xlsx หรือ xlrd สำหรับไฟล์ .xls แบบเดิม

df = pd.read_excel('diabetes.xlsx')

ยังสามารถระบุอาร์กิวเมนต์อื่นได้ เช่น header เพื่อกำหนดว่าแถวใดเป็นส่วนหัวของ DataFrame ค่าดีฟอลต์คือ 0 ซึ่งหมายถึงแถวแรกเป็นส่วนหัวหรือชื่อคอลัมน์ สามารถระบุชื่อคอลัมน์เป็นลิสต์ในอาร์กิวเมนต์ names ได้ อาร์กิวเมนต์ index_col (ดีฟอลต์คือ None) ใช้เมื่อตัวไฟล์มีดัชนีแถว

หมายเหตุ: ใน pandas DataFrame หรือ Series ดัชนีคือสิ่งที่ระบุตำแหน่งของแถวหรือคอลัมน์ใน DataFrame โดยสรุป ดัชนีเป็นป้ายกำกับแถวหรือคอลัมน์ของ DataFrame และช่วยให้เข้าถึงแถวหรือคอลัมน์ที่ต้องการได้ด้วยดัชนี (จะเห็นต่อไป) ดัชนีแถวของ DataFrame อาจเป็นช่วงตัวเลข (เช่น 0 ถึง 303) อนุกรมเวลา (วันที่หรือเวลาประทับ) ตัวระบุเฉพาะ (เช่น employee_ID ในตาราง employees) หรือชนิดข้อมูลอื่น ๆ สำหรับคอลัมน์ โดยมากจะเป็นสตริง (ชื่อคอลัมน์)

นำเข้าไฟล์ Excel (หลายชีต)

การอ่านไฟล์ Excel ที่มีหลายชีตก็ไม่ต่างกันมาก เพียงระบุอาร์กิวเมนต์เพิ่มเติม sheet_name โดยส่งเป็นสตริงชื่อชีตหรือจำนวนเต็มที่แทนตำแหน่งชีต (สังเกตว่า Python ใช้เลขเริ่มที่ 0 โดยชีตแรกเข้าถึงได้ด้วย sheet_name = 0)

# ดึงชีตที่สองเพราะ Python เริ่มนับที่ 0
df = pd.read_excel('diabetes_multi.xlsx', sheet_name=1)

นำเข้าไฟล์ JSON

เช่นเดียวกับฟังก์ชัน read_csv() สามารถใช้ read_json() สำหรับไฟล์ชนิด JSON โดยใส่ชื่อไฟล์ JSON เป็นอาร์กิวเมนต์ (อ่านรายละเอียดเพิ่มเติมได้จาก บทเรียนนี้เกี่ยวกับการนำเข้า JSON และ HTML สู่ pandas) โค้ดด้านล่างอ่านไฟล์ JSON จากดิสก์และสร้างออบเจกต์ DataFrame ชื่อ df

df = pd.read_json("diabetes.json")

หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการนำเข้าข้อมูลด้วย pandas ดู ชีตสรุป นี้เกี่ยวกับการนำเข้าหลากหลายไฟล์ด้วย Python

นำเข้าข้อมูลจากฐานข้อมูล SQL

หากต้องการโหลดข้อมูลจากฐานข้อมูลเชิงสัมพันธ์ ใช้ pd.read_sql() ร่วมกับการเชื่อมต่อฐานข้อมูล

import sqlite3

# Establish a connection to an SQLite database
conn = sqlite3.connect("my_database.db")

# Read data from a table
df = pd.read_sql("SELECT * FROM my_table", conn)

สำหรับฐานข้อมูลอื่น เช่น PostgreSQL หรือ MySQL ให้ส่งเอนจิน SQLAlchemy เป็นการเชื่อมต่อแทนการใช้การเชื่อมต่อ sqlite3 สำหรับตารางขนาดใหญ่ ให้ตั้งอาร์กิวเมนต์ chunksize เพื่ออ่านผลลัพธ์เป็นช่วง ๆ

นำเข้าข้อมูลจาก API (ฟอร์แมต JSON)

ถ้าข้อมูลมาจากเว็บ API pandas สามารถอ่านได้โดยตรงด้วย pd.read_json():

df = pd.read_json("https://api.example.com/data.json")

ถ้าผลลัพธ์จาก API เป็น JSON แบบซ้อนกัน ให้ทำให้แบนด้วย pd.json_normalize() ซึ่งจะแปลงกุญแจที่ซ้อนกันให้เป็นคอลัมน์คั่นด้วยจุด:

records = [
    {"id": 1, "vitals": {"glucose": 148, "bmi": 33.6}},
    {"id": 2, "vitals": {"glucose": 85, "bmi": 26.6}},
]
pd.json_normalize(records)
   id  vitals.glucose  vitals.bmi
0   1             148        33.6
1   2              85        26.6

การส่งออกข้อมูลใน pandas

เช่นเดียวกับที่ pandas นำเข้าข้อมูลจากไฟล์หลายประเภทได้ ก็สามารถส่งออกข้อมูลเป็นหลายฟอร์แมตได้เช่นกัน กรณีนี้พบได้บ่อยเมื่อแปลงข้อมูลด้วย pandas แล้วต้องบันทึกไว้ในเครื่อง ด้านล่างคือตัวอย่างการส่งออก DataFrame ของ pandas เป็นฟอร์แมตต่าง ๆ

ส่งออก DataFrame เป็นไฟล์ CSV

บันทึก pandas DataFrame (ที่นี่ใช้ df) เป็นไฟล์ CSV ด้วยเมธอด .to_csv() ระบุพาธไฟล์ และตั้ง index=False เว้นแต่ต้องการให้มีดัชนีแถวในไฟล์ (ค่าดีฟอลต์ index=True จะเขียนเป็นคอลัมน์ไม่มีชื่อเพิ่มเข้ามา) บทเรียนเกี่ยวกับ การบันทึก DataFrame เป็น CSV ครอบคลุมอาร์กิวเมนต์อื่น ๆ

df.to_csv("diabetes_out.csv", index=False)

ส่งออก DataFrame เป็นไฟล์ JSON

ส่งออกออบเจกต์ DataFrame เป็นไฟล์ JSON โดยเรียกเมธอด .to_json()

df.to_json("diabetes_out.json")

หมายเหตุ: ไฟล์ JSON จัดเก็บออบเจกต์ตารางอย่าง DataFrame เป็นคู่คีย์-ค่า ดังนั้นจึงมักเห็นชื่อคอลัมน์ซ้ำ ๆ ในไฟล์ JSON

ส่งออก DataFrame เป็นไฟล์ข้อความ

เช่นเดียวกับการเขียน DataFrame เป็นไฟล์ CSV ให้เรียก .to_csv() ความต่างคือฟอร์แมตเอาต์พุตเป็น .txt และต้องระบุตัวคั่นด้วยอาร์กิวเมนต์ sep

df.to_csv('diabetes_out.txt', header=df.columns, index=None, sep=' ')

ส่งออก DataFrame เป็นไฟล์ Excel

เรียก .to_excel() บน DataFrame เพื่อบันทึกเป็นไฟล์ .xlsx (ต้องใช้ openpyxl) pandas ไม่สามารถเขียนไฟล์ .xls รุ่นเก่าได้อีกต่อไป

df.to_excel("diabetes_out.xlsx", index=False)

การดูและทำความเข้าใจ DataFrame ใน pandas

หลังจากอ่านข้อมูลแบบตารางเป็น DataFrame แล้ว ควรดูภาพรวมของข้อมูลก่อน สามารถดูตัวอย่างบางส่วนของชุดข้อมูลหรือดูสรุปข้อมูลในรูปค่าสถิติสรุปได้

วิธีดูข้อมูลด้วย .head() และ .tail()

ดูแถวแรก ๆ หรือแถวท้าย ๆ ของ DataFrame ด้วยเมธอด .head() หรือ .tail() ตามลำดับ สามารถระบุจำนวนแถวได้ผ่านอาร์กิวเมนต์ n (ค่าดีฟอลต์คือ 5)

df.head()

ห้าแถวแรกของ DataFrame (df) ด้วย .head()

ห้าแถวแรกของ DataFrame

df.tail(n = 10)

สิบแถวสุดท้ายของ DataFrame ด้วย .tail()

สิบแถวสุดท้ายของ DataFrame

ทำความเข้าใจข้อมูลด้วย .describe()

เมธอด .describe() จะแสดงค่าสถิติสรุปของคอลัมน์ตัวเลขทั้งหมด เช่น จำนวน ค่าเฉลี่ย ส่วนเบี่ยงเบนมาตรฐาน ช่วง และควอร์ไทล์ของคอลัมน์ตัวเลข

df.describe()

ดูค่าสถิติสรุปด้วย .describe()

ดูค่าสถิติสรุปด้วย .describe()

ช่วยให้เห็นสเกล การเอียงกระจาย และช่วงของข้อมูลเชิงตัวเลขได้อย่างรวดเร็ว

ยังสามารถปรับควอร์ไทล์ได้ด้วยอาร์กิวเมนต์ percentiles ตัวอย่างนี้ดูเปอร์เซ็นไทล์ที่ 30%, 50% และ 70% ของคอลัมน์ตัวเลขใน DataFrame df

df.describe(percentiles=[0.3, 0.5, 0.7])

ดูค่าสถิติสรุปพร้อมเปอร์เซ็นไทล์ที่กำหนดใน pandas

ดูค่าสถิติสรุปพร้อมเปอร์เซ็นไทล์ที่กำหนด

ยังสามารถเลือกสรุพ์เฉพาะชนิดข้อมูลที่ต้องการได้ด้วยอาร์กิวเมนต์ include ตัวอย่างนี้สรุปเฉพาะคอลัมน์ที่มีชนิดข้อมูลเป็น integer

df.describe(include=[int])

ค่าสถิติสรุปเฉพาะคอลัมน์ชนิดจำนวนเต็มใน pandas

ค่าสถิติสรุปเฉพาะคอลัมน์ชนิดจำนวนเต็ม

ในทำนองเดียวกัน อาจต้องการตัดชนิดข้อมูลบางประเภทออกด้วยอาร์กิวเมนต์ exclude

df.describe(exclude=[int])
              BMI  DiabetesPedigreeFunction
count  768.000000                768.000000
mean    31.992578                  0.471876
std      7.884160                  0.331329
min      0.000000                  0.078000
25%     27.300000                  0.243750
50%     32.000000                  0.372500
75%     36.600000                  0.626250
max     67.100000                  2.420000


ผู้ปฏิบัติงานมักมองว่าสถิติเหล่านี้อ่านง่ายขึ้นเมื่อทรานสโพสด้วยแอตทริบิวต์ .T

df.describe().T

ทรานสโพสค่าสถิติสรุปใน pandas

ทรานสโพสค่าสถิติสรุปด้วย .T


สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการสรุป DataFrame ดู ชีตสรุป ต่อไปนี้

ทำความเข้าใจข้อมูลด้วย .info()

เมธอด .info() เป็นวิธีที่รวดเร็วในการดูชนิดข้อมูล ค่าที่หายไป และขนาดของข้อมูลใน DataFrame ที่นี่กำลังกำหนดอาร์กิวเมนต์ show_counts ให้เป็น True เพื่อแสดงจำนวนค่าที่ไม่หายไปในแต่ละคอลัมน์ และกำหนด memory_usage เป็น True เพื่อแสดงการใช้หน่วยความจำทั้งหมดขององค์ประกอบใน DataFrame เมื่อกำหนด verbose เป็น True จะพิมพ์สรุปเต็มรูปแบบจาก .info() 

df.info(show_counts=True, memory_usage=True, verbose=True)
<class 'pandas.DataFrame'>
RangeIndex: 768 entries, 0 to 767
Data columns (total 9 columns):
 #   Column                    Non-Null Count  Dtype  
---  ------                    --------------  -----  
 0   Pregnancies               768 non-null    int64  
 1   Glucose                   768 non-null    int64  
 2   BloodPressure             768 non-null    int64  
 3   SkinThickness             768 non-null    int64  
 4   Insulin                   768 non-null    int64  
 5   BMI                       768 non-null    float64
 6   DiabetesPedigreeFunction  768 non-null    float64
 7   Age                       768 non-null    int64  
 8   Outcome                   768 non-null    int64  
dtypes: float64(2), int64(7)
memory usage: 54.1 KB

ทำความเข้าใจข้อมูลด้วย .shape

จำนวนแถวและคอลัมน์ของ DataFrame สามารถดูได้จากแอททริบิวต์ .shape ซึ่งจะคืนค่าเป็นทูเพิล (แถว, คอลัมน์) และสามารถเข้าถึงด้วยดัชนีเพื่อให้ได้เฉพาะจำนวนแถวหรือเฉพาะจำนวนคอลัมน์เป็นผลลัพธ์

df.shape # Get the number of rows and columns
df.shape[0] # Get the number of rows only
df.shape[1] # Get the number of columns only
(768,9)
768
9

ดึงทุกคอลัมน์และชื่อคอลัมน์

การเรียกแอททริบิวต์ .columns ของอ็อบเจกต์ DataFrame จะคืนชื่อคอลัมน์ในรูปแบบของอ็อบเจกต์ Index เตือนความจำว่า index ของ pandas คือที่อยู่/ป้ายกำกับของแถวหรือคอลัมน์

df.columns
Index(['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI',
       'DiabetesPedigreeFunction', 'Age', 'Outcome'],
      dtype='str')

สามารถแปลงเป็นลิสต์ได้ด้วยฟังก์ชัน list()

list(df.columns)
['Pregnancies',
 'Glucose',
 'BloodPressure',
 'SkinThickness',
 'Insulin',
 'BMI',
 'DiabetesPedigreeFunction',
 'Age',
 'Outcome']

ตรวจหาค่าที่หายไปใน pandas ด้วย .isnull()

DataFrame ตัวอย่างนี้ไม่มีค่าที่หายไป ลองใส่ค่าที่หายไปบางส่วนเพื่อให้เห็นภาพ เมธอด .copy() ใช้ทำสำเนาของ DataFrame ต้นฉบับ การทำงานบนสำเนาจะทำให้ df ต้นฉบับคงเดิมสำหรับตัวอย่างถัดไป โดยใช้ .loc (จะกล่าวถึงภายหลัง) สามารถกำหนดให้แถวที่มีป้ายกำกับ 2 ถึง 5 ของคอลัมน์ Pregnancies เป็นค่าที่หายไปได้ เนื่องจากค่าที่หายไปถูกเก็บเป็น NaN ซึ่งเป็น float pandas จึงแปลงชนิดของคอลัมน์จาก int64 เป็น float64

df2 = df.copy()
df2.loc[2:5,'Pregnancies'] = None
df2.head(7)

Rows 2 to 5 are missing pandas

จะเห็นว่าแถว 2 ถึง 5 ตอนนี้เป็น NaN

สามารถตรวจสอบได้ว่าแต่ละองค์ประกอบใน DataFrame เป็นค่าที่หายไปหรือไม่ด้วยเมธอด .isnull()

df2.isnull().head(7)

โดยทั่วไปการรู้ปริมาณข้อมูลที่หายไปมีประโยชน์กว่า สามารถผสาน .isnull() กับ .sum() เพื่อให้นับจำนวนค่า null ในแต่ละคอลัมน์ได้

df2.isnull().sum()
Pregnancies                 4
Glucose                     0
BloodPressure               0
SkinThickness               0
Insulin                     0
BMI                         0
DiabetesPedigreeFunction    0
Age                         0
Outcome                     0
dtype: int64

ยังสามารถใช้ sum ซ้อนอีกครั้งเพื่อหาจำนวนค่า null ทั้งหมดใน DataFrame ได้

df2.isnull().sum().sum()
4

การเรียงลำดับ การสไลซ์ และการดึงข้อมูลใน pandas

แพ็กเกจ pandas มีหลายวิธีในการเรียงลำดับ สร้างชุดย่อย กรอง และแยกข้อมูลใน DataFrame ส่วนนี้จะแสดงวิธีที่ใช้บ่อยที่สุด

การเรียงลำดับข้อมูล

หากต้องการเรียงลำดับ DataFrame ตามคอลัมน์ใดคอลัมน์หนึ่ง ให้ใช้ .sort_values() ซึ่งจะคืนค่า DataFrame ใหม่ที่เรียงแล้วและไม่เปลี่ยนแปลง df ดังนั้นหากต้องการเก็บผลลัพธ์ไว้ ให้กำหนดค่าให้ตัวแปร:

df.sort_values(by="Age", ascending=False)  # Sort by Age in descending order

สามารถเรียงตามหลายคอลัมน์ได้:

df.sort_values(by=["Age", "Glucose"], ascending=[False, True])

การรีเซ็ตดัชนี

การเรียงหรือการกรองจะคงป้ายกำกับแถวเดิมไว้ ทำให้ดัชนีไม่เป็นลำดับ ใช้ .reset_index() เพื่อให้ได้ดัชนีใหม่เริ่มที่ 0 (ดู คู่มือการรีเซ็ตอินเด็กซ์ของ pandas สำหรับตัวเลือกอื่นๆ):

df_sorted = df.sort_values(by="Age", ascending=False).reset_index(drop=True)  # drop=True discards the old index
df_sorted[["Age", "Glucose", "Outcome"]].head(3)
   Age  Glucose  Outcome
0   81      134        0
1   72      119        0
2   70      145        1

แยกคอลัมน์เดียวด้วย [ ] 

สามารถแยกคอลัมน์เดียวได้โดยใช้วงเล็บเหลี่ยม [ ] ครอบชื่อคอลัมน์ ผลลัพธ์จะเป็นอ็อบเจกต์ Series ของ pandas โดย Series คืออาเรย์หนึ่งมิติที่เก็บข้อมูลได้ทุกชนิด เช่น จำนวนเต็ม ทศนิยม สตริง บูลีน อ็อบเจกต์ของไพธอน เป็นต้น ส่วน DataFrame ประกอบด้วยซีรีส์หลายชุดที่ทำหน้าที่เป็นคอลัมน์

df['Outcome']
0      1
1      0
2      1
3      0
4      1
      ..
763    0
764    0
765    0
766    1
767    0
Name: Outcome, Length: 768, dtype: int64

แยกสองคอลัมน์ขึ้นไปด้วย [[ ]] 

ยังสามารถระบุรายชื่อคอลัมน์ภายในวงเล็บเหลี่ยมเพื่อดึงมากกว่าหนึ่งคอลัมน์ได้ ตรงนี้มีการใช้วงเล็บเหลี่ยมสองระดับ ระดับนอกใช้บ่งชี้ชุดย่อยของ DataFrame และระดับในใช้สร้างลิสต์

df[['Pregnancies', 'Outcome']]
     Pregnancies  Outcome
0              6        1
1              1        0
2              8        1
3              1        0
4              0        1
..           ...      ...
763           10        0
764            2        0
765            5        0
766            1        1
767            1        0

[768 rows x 2 columns]

แยกหนึ่งแถวด้วย [ ] 

สามารถดึงแถวเดียวได้ด้วยการส่งซีรีส์บูลีนที่มีค่า True เพียงค่าเดียว ในตัวอย่างด้านล่างจะคืนค่าแถวที่สองที่มี index = 1 ที่นี่ .index จะคืนป้ายกำกับแถวของ DataFrame และการเปรียบเทียบจะทำให้เป็นอาเรย์บูลีนหนึ่งมิติ

df[df.index==1]

Isolating one row in pandas

การแยกหนึ่งแถวใน pandas

แยกสองแถวขึ้นไปด้วย [ ] 

ในทำนองเดียวกัน สามารถคืนค่าสองแถวขึ้นไปได้โดยใช้เมธอด .isin() แทนตัวดำเนินการ ==

df[df.index.isin(range(2,10))]

Isolating specific rows in pandas

การแยกแถวเฉพาะใน pandas

ใช้ .loc[] และ .iloc[] เพื่อดึงแถว

สามารถดึงแถวเฉพาะโดยอิงจากป้ายกำกับหรือเงื่อนไขด้วย .loc[] และ .iloc[] ("location" และ "integer location") โดย .loc[] ใช้ป้ายกำกับเพื่อชี้ไปยังแถว คอลัมน์ หรือเซลล์ ขณะที่ .iloc[] ใช้ตำแหน่งแบบตัวเลข คู่มือ loc vs iloc ของเราครอบคลุมความแตกต่างทั้งหมด เพื่อดูประเด็นหลักในที่นี้ จะเปลี่ยนดัชนีของ df2 ที่สร้างไว้ก่อนหน้าเพื่อให้ป้ายกำกับและตำแหน่งไม่ตรงกัน

.loc[] selects by label, .iloc[] by position

df2.index = range(1,769)

ตัวอย่างด้านล่างจะคืนค่าเป็น Series ของ pandas แทนที่จะเป็น DataFrame ใน .loc[1] ค่า 1 คือป้ายกำกับ จึงได้แถวที่มีป้ายกำกับ 1 (แถวแรกหลังการจัดดัชนีใหม่) ส่วนใน .iloc[1] ค่า 1 คือ ตำแหน่งแบบเริ่มนับที่ศูนย์ จึงได้แถวที่สองซึ่งมีป้ายกำกับ 2

df2.loc[1]
Pregnancies                   6.000
Glucose                     148.000
BloodPressure                72.000
SkinThickness                35.000
Insulin                       0.000
BMI                          33.600
DiabetesPedigreeFunction      0.627
Age                          50.000
Outcome                       1.000
Name: 1, dtype: float64
df2.iloc[1]
Pregnancies                  1.000
Glucose                     85.000
BloodPressure               66.000
SkinThickness               29.000
Insulin                      0.000
BMI                         26.600
DiabetesPedigreeFunction     0.351
Age                         31.000
Outcome                      0.000
Name: 2, dtype: float64

ยังสามารถดึงหลายแถวด้วยการกำหนดช่วงในวงเล็บเหลี่ยม ทั้งสองแอคเซสเซอร์นี้ปฏิบัติต่อปลายช่วงต่างกัน: .loc[100:110] จะรวมป้ายกำกับ 110 และคืนค่า 11 แถว ในขณะที่ .iloc[100:110] จะหยุดก่อนตำแหน่ง 110 และคืนค่า 10 แถว

df2.loc[100:110]

Isolating rows with loc

การแยกแถวใน pandas ด้วย .loc[]

df2.iloc[100:110]

Isolating rows in pandas with .loc[]

การแยกแถวใน pandas ด้วย .iloc[]

ยังสามารถทำชุดย่อยด้วย .loc[] และ .iloc[] โดยใช้ลิสต์แทนการใช้ช่วง

df2.loc[[100, 200, 300]]

Isolating rows using a list in pandas with .loc[]

การแยกแถวด้วยลิสต์ใน pandas ด้วย .loc[]

df2.iloc[[100, 200, 300]]

Rows at positions 100, 200, and 300 selected with .iloc[]

การแยกแถวด้วยลิสต์ใน pandas ด้วย .iloc[]

ยังสามารถเลือกคอลัมน์เฉพาะพร้อมกับแถวได้ จุดนี้ .iloc[] ต่างจาก .loc[] ตรงที่ต้องใช้ตำแหน่งคอลัมน์ ไม่ใช่ชื่อคอลัมน์

df2.loc[100:110, ['Pregnancies', 'Glucose', 'BloodPressure']]
     Pregnancies  Glucose  BloodPressure
100          1.0      122             90
101          1.0      163             72
102          1.0      151             60
103          0.0      125             96
104          1.0       81             72
105          2.0       85             65
106          1.0      126             56
107          1.0       96            122
108          4.0      144             58
109          3.0       83             58
110          0.0       95             85
df2.iloc[100:110, :3]
     Pregnancies  Glucose  BloodPressure
101          1.0      163             72
102          1.0      151             60
103          0.0      125             96
104          1.0       81             72
105          2.0       85             65
106          1.0      126             56
107          1.0       96            122
108          4.0      144             58
109          3.0       83             58
110          0.0       95             85

เพื่อขั้นตอนการทำงานที่รวดเร็วขึ้น สามารถส่งดัชนีเริ่มต้นของแถวเป็นช่วงได้

df2.loc[760:, ['Pregnancies', 'Glucose', 'BloodPressure']]
     Pregnancies  Glucose  BloodPressure
760          6.0      190             92
761          2.0       88             58
762          9.0      170             74
763          9.0       89             62
764         10.0      101             76
765          2.0      122             70
766          5.0      121             72
767          1.0      126             60
768          1.0       93             70
df2.iloc[760:, :3]
     Pregnancies  Glucose  BloodPressure
761          2.0       88             58
762          9.0      170             74
763          9.0       89             62
764         10.0      101             76
765          2.0      122             70
766          5.0      121             72
767          1.0      126             60
768          1.0       93             70

สามารถอัปเดตค่าด้วยการผสาน .loc[] เข้ากับตัวดำเนินการกำหนดค่า = สร้างเงื่อนไขจาก DataFrame เดียวกับที่กำลังอัปเดต: หากสร้างเงื่อนไขจาก df จะไม่ตรงกับดัชนีใหม่ของ df2 และ pandas จะแจ้งข้อผิดพลาด

df2.loc[df2["Age"] == 81, "Age"] = 80

การกรองแถวด้วยเงื่อนไข

pandas อนุญาตให้กรองข้อมูลด้วยเงื่อนไขจากค่าในแถว/คอลัมน์ ตัวอย่างเช่น โค้ดด้านล่างเลือกแถวที่ค่าความดันโลหิต (Blood Pressure) เท่ากับ 122 ที่นี่กำลังแยกแถวโดยใช้วงเล็บเหลี่ยม [ ] ตามที่เห็นในส่วนก่อนหน้า แต่แทนที่จะใส่ดัชนีแถวหรือชื่อคอลัมน์ เราใส่เงื่อนไขว่าคอลัมน์ BloodPressure เท่ากับ 122 เขียนเงื่อนไขนี้เป็น df.BloodPressure == 122

df[df.BloodPressure == 122]

Isolating rows based on a condition in pandas

การแยกแถวตามเงื่อนไขใน pandas 

ตัวอย่างด้านล่างดึงทุกแถวที่ Outcome เป็น 1 โดย df.Outcome เลือกคอลัมน์นั้น df.Outcome == 1 จะให้ Series ของค่าบูลีนที่ระบุว่า Outcome ใดเท่ากับ 1 จากนั้น [] จะเลือกชุดย่อยของ df ที่ Series บูลีนนั้นเป็น True

df[df.Outcome == 1]

Isolating rows based on a condition in pandas

การแยกแถวตามเงื่อนไขใน pandas 

สามารถใช้ตัวดำเนินการ > เพื่อเปรียบเทียบได้ โค้ดด้านล่างดึงคอลัมน์ Pregnancies, Glucose และ BloodPressure สำหรับทุกรายการที่มี BloodPressure มากกว่า 100

df.loc[df['BloodPressure'] > 100, ['Pregnancies', 'Glucose', 'BloodPressure']]
     Pregnancies  Glucose  BloodPressure
43             9      171            110
84             5      137            108
106            1       96            122
177            0      129            110
207            5      162            104
362            5      103            108
369            1      133            102
440            0      189            104
549            4      189            110
658           11      127            106
662            8      167            106
672           10       68            106
691           13      158            114

การทำความสะอาดข้อมูลใน pandas

การทำความสะอาดข้อมูลเป็นงานที่พบบ่อยมากในงานวิทยาการข้อมูล pandas ช่วยให้เตรียมข้อมูลล่วงหน้าได้สำหรับทุกการใช้งาน รวมถึงการฝึกสอนโมเดลแมชชีนเลิร์นนิงและดีปเลิร์นนิง มาลองใช้ DataFrame df2 จากก่อนหน้า ซึ่งมีค่าว่างสี่ค่า เพื่ออธิบายกรณีการใช้งานบางอย่าง ในการทวนความจำ นี่คือวิธีดูว่ามีค่าที่หายไปกี่ค่าใน DataFrame

df2.isnull().sum()
Pregnancies                 4
Glucose                     0
BloodPressure               0
SkinThickness               0
Insulin                     0
BMI                         0
DiabetesPedigreeFunction    0
Age                         0
Outcome                     0
dtype: int64

เทคนิคจัดการค่าที่หายไป #1: ลบค่าที่หายไป

วิธีหนึ่งในการจัดการค่าที่หายไปคือการลบทิ้ง วิธีนี้มีประโยชน์โดยเฉพาะเมื่อมีข้อมูลจำนวนมากและการสูญเสียส่วนน้อยจะไม่กระทบการวิเคราะห์ถัดไป สามารถใช้เมธอด .dropna() ดังแสดงด้านล่าง ที่นี่จะบันทึกผลจาก .dropna() ไว้ใน DataFrame ชื่อ df3

df3 = df2.copy()
df3 = df3.dropna()
df3.shape
(764, 9) # this is 4 rows less than df2

อาร์กิวเมนต์ axis ช่วยระบุว่าจะลบแถว หรือคอลัมน์ ที่มีค่าหายไป ค่าปริยายของ axis จะลบแถวที่มี NaN ใช้ axis = 1 เพื่อลบคอลัมน์ที่มีค่า NaN อย่างน้อยหนึ่งค่า เช่นเดียวกับทุกตัวอย่างในบทความนี้ เราจะกำหนดผลลัพธ์กลับ แทนการใช้ inplace=True ซึ่ง pandas 3.1 เลิกใช้สำหรับ .dropna()

df3 = df2.dropna(axis=1)
list(df3.columns)
['Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age', 'Outcome']

โดยปริยาย .dropna() จะลบแถวถ้ามีค่าหนึ่งค่าขึ้นไปหายไป กำหนดอาร์กิวเมนต์ how เป็น 'all' เพื่อให้ลบเฉพาะแถวที่ทุกค่าหายไป ใน df2 ไม่มีแถวใดว่างทั้งหมด จึงไม่ถูกลบอะไรออก

df3 = df2.dropna(how="all")
df3.shape
(768, 9)

เทคนิคจัดการค่าที่หายไป #2: แทนที่ค่าที่หายไป

แทนที่จะลบค่า สามารถแทนที่ด้วยสถิติสรุปหรือค่าคงที่ได้ ตัวอย่างเช่น ถ้าวันหนึ่งหายไปจากการอ่านอุณหภูมิหนึ่งสัปดาห์ การเติมค่าด้วยค่าเฉลี่ยของสัปดาห์นั้นจะคงแถวดังกล่าวไว้และสูญเสียข้อมูลเพียงเล็กน้อย โค้ดด้านล่างเติมค่า Pregnancies ที่หายไปด้วยค่าเฉลี่ยของคอลัมน์นั้น

df3 = df2.copy()
# Get the mean of Pregnancies
mean_value = df3["Pregnancies"].mean()
# Fill only that column's missing values
df3["Pregnancies"] = df3["Pregnancies"].fillna(mean_value)
df3["Pregnancies"].head(7)
1    6.000000
2    1.000000
3    3.846859
4    3.846859
5    3.846859
6    3.846859
7    3.000000
Name: Pregnancies, dtype: float64

การจัดการข้อมูลซ้ำ

ลองเพิ่มแถวซ้ำลงในข้อมูลต้นฉบับเพื่อเรียนรู้วิธีลบข้อมูลซ้ำใน DataFrame ที่นี่ใช้ฟังก์ชัน pd.concat() เพื่อต่อแถวของ DataFrame df2 เข้ากับ df2 อีกครั้ง ทำให้ได้สำเนาแถวทุกแถวใน df2 เพิ่มเข้ามา

df3 = pd.concat([df2, df2])
df3.shape
(1536, 9)

สามารถลบแถวที่ซ้ำทั้งหมด (ค่าเริ่มต้น) ออกจาก DataFrame ได้โดยใช้เมธอด .drop_duplicates()

df3 = df3.drop_duplicates()
df3.shape
(768, 9)

การเปลี่ยนชื่อคอลัมน์

งานทำความสะอาดข้อมูลที่พบบ่อยคือการเปลี่ยนชื่อคอลัมน์ ให้ส่งเมธอด .rename() พร้อมพจนานุกรม columns ที่แมปชื่อเดิมกับชื่อใหม่

df3 = df3.rename(columns={"DiabetesPedigreeFunction": "DPF"})
df3[["Glucose", "BMI", "DPF", "Age"]].head()
   Glucose   BMI    DPF  Age
1      148  33.6  0.627   50
2       85  26.6  0.351   31
3      183  23.3  0.672   32
4       89  28.1  0.167   21
5      137  43.1  2.288   33

ยังสามารถกำหนดลิสต์ชื่อแบบเต็มให้กับ .columns ได้ โดยลิสต์ต้องมีชื่อครบทุกคอลัมน์ตามลำดับปัจจุบัน: pandas จะกำหนดชื่อตามตำแหน่ง ดังนั้นลิสต์ที่เรียงผิดลำดับจะทำให้ข้อมูลถูกติดป้ายสลับโดยไม่แจ้งเตือน

df3.columns = ["Pregnancies", "Glucose", "BloodPressure", "SkinThickness", "Insulin", "BMI", "DPF", "Age", "Outcome"]
list(df3.columns)
['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DPF', 'Age', 'Outcome']

หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการทำความสะอาดข้อมูล และเพื่อเวิร์กโฟลว์ที่ง่ายและคาดเดาได้มากขึ้น ลองดูเช็กลิสต์ต่อไปนี้ซึ่งรวบรวมชุดงานทำความสะอาดข้อมูลที่พบได้บ่อยอย่างครบถ้วน 

การผสาน DataFrame ใน pandas

pandas ผสาน DataFrame ได้สองวิธี: .merge() รวมตารางบนคีย์คอลัมน์ร่วมกัน คล้ายกับการ join ใน SQL และ pd.concat() ใช้ต่อเรียงตารางซ้อนกันด้านบนหรือต่อข้างกัน

การผสาน DataFrame ด้วย .merge()

ใช้ .merge() เมื่อสองตารางมีคอลัมน์คีย์ร่วมกัน สมมติว่ามีตารางที่สองที่แมปแต่ละรหัส Outcome เข้ากับป้ายกำกับที่อ่านได้ การทำ left merge บน Outcome จะเพิ่มป้ายนี้ให้ทุกรายการของผู้ป่วย

outcome_labels = pd.DataFrame({"Outcome": [0, 1], "Diagnosis": ["Non-diabetic", "Diabetic"]})

df_labeled = df.merge(outcome_labels, on="Outcome", how="left")
df_labeled[["Glucose", "Outcome", "Diagnosis"]].head(3)
   Glucose  Outcome     Diagnosis
0      148        1      Diabetic
1       85        0  Non-diabetic
2      183        1      Diabetic

อาร์กิวเมนต์ how กำหนดชนิดของ join: "left" เก็บทุกแถวของ df, "inner" เก็บเฉพาะแถวที่มีคู่ตรงกันในทั้งสองตาราง และ "outer" เก็บทุกแถวจากทั้งสองตาราง บทช่วยสอนเรื่องการ join DataFrame ใน pandas ครอบคลุม .join() และชนิดของ join ทั้งหมดอย่างละเอียด

การต่อ DataFrame ด้วย pd.concat()

ใช้ pd.concat() เมื่อสองตารางมีคอลัมน์เหมือนกันและต้องการต่อแถว เช่น บันทึกผู้ป่วยที่เข้ามาเป็นสองล็อต กำหนด ignore_index=True เพื่อให้ได้ดัชนีใหม่เริ่มที่ 0 แทนการคงป้ายกำกับของแต่ละล็อตไว้

batch_1 = df.iloc[:500]
batch_2 = df.iloc[500:]

df_combined = pd.concat([batch_1, batch_2], ignore_index=True)
df_combined.shape
(768, 9)

เมื่อกำหนด axis=1 pd.concat() จะวางตารางไว้ข้างกันแทน โดยจับคู่แถวตามป้ายกำกับดัชนี

measurements = df[["Glucose", "BMI"]]
outcomes = df[["Outcome"]]

pd.concat([measurements, outcomes], axis=1).head(3)
   Glucose   BMI  Outcome
0      148  33.6        1
1       85  26.6        0
2      183  23.3        1

หากต้องการฝึกปฏิบัติทั้งสองวิธี ลองคอร์ส Joining Data with pandas

การวิเคราะห์ข้อมูลใน pandas

คุณค่าหลักของ pandas คือความสามารถในการวิเคราะห์ข้อมูลได้อย่างรวดเร็ว ในส่วนนี้จะเน้นเทคนิคการวิเคราะห์ชุดหนึ่งที่สามารถใช้ใน pandas

โอเปอเรเตอร์สรุป (ค่าเฉลี่ย ฐานนิยม มัธยฐาน)

ดังที่เห็นก่อนหน้านี้ สามารถหาค่าเฉลี่ยของแต่ละคอลัมน์ได้ด้วยเมธอด .mean()

df.mean()
Pregnancies                   3.845052
Glucose                     120.894531
BloodPressure                69.105469
SkinThickness                20.536458
Insulin                      79.799479
BMI                          31.992578
DiabetesPedigreeFunction      0.471876
Age                          33.240885
Outcome                       0.348958
dtype: float64

ฐานนิยมสามารถคำนวณได้ในลักษณะเดียวกันด้วยเมธอด .mode() 

df.mode()

Mode of each column in pandas

พิมพ์ค่าฐานนิยมของคอลัมน์ใน pandas

ในทำนองเดียวกัน มัธยฐานของแต่ละคอลัมน์คำนวณได้ด้วยเมธอด .median()

df.median()
Pregnancies                   3.0000
Glucose                     117.0000
BloodPressure                72.0000
SkinThickness                23.0000
Insulin                      30.5000
BMI                          32.0000
DiabetesPedigreeFunction      0.3725
Age                          29.0000
Outcome                       0.0000
dtype: float64

สร้างคอลัมน์ใหม่จากคอลัมน์ที่มีอยู่ 

pandas ให้การคำนวณที่รวดเร็วและมีประสิทธิภาพโดยการรวมสองคอลัมน์ขึ้นไปเสมือนเป็นตัวแปรสเกลาร์ โค้ดด้านล่างหารค่าทุกค่าของคอลัมน์ Glucose ด้วยค่าที่สอดคล้องกันในคอลัมน์ Insulin เพื่อคำนวณคอลัมน์ใหม่ชื่อ Glucose_Insulin_Ratio

df2['Glucose_Insulin_Ratio'] = df2['Glucose']/df2['Insulin']
df2.head()

Create a new column from existing columns in pandas

สร้างคอลัมน์ใหม่จากคอลัมน์ที่มีอยู่ใน pandas

แถวที่ Insulin เป็น 0 จะแสดง inf เพราะการหารด้วยศูนย์ให้ค่าเป็นอนันต์ ในชุดข้อมูลนี้ ค่า 0 สำหรับ Insulin หมายถึงไม่มีการวัดค่า (374 จาก 768 แถว) ดังนั้นควรถือว่าเลขศูนย์เหล่านั้นเป็นค่าที่หายไปก่อนทำการหาร

df2["Glucose_Insulin_Ratio"] = df2["Glucose"] / df2["Insulin"].where(df2["Insulin"] > 0)
df2["Glucose_Insulin_Ratio"].head()
1         NaN
2         NaN
3         NaN
4    0.946809
5    0.815476
Name: Glucose_Insulin_Ratio, dtype: float64

.where() จะคงค่าที่ตรงตามเงื่อนไขและแทนค่าที่เหลือด้วย NaN ดังนั้นอัตราส่วนจะเป็นค่าว่างแทนที่จะเป็นอนันต์สำหรับแถวดังกล่าว บทช่วยสอนเรื่องการเพิ่มคอลัมน์ใน pandas แสดงวิธีอื่นๆ ในการสร้างคอลัมน์ใหม่

การนับด้วย .value_counts()

เมื่อคอลัมน์เก็บหมวดหมู่ มักต้องการนับว่ามีรายการอยู่ในแต่ละหมวดเท่าใด เมธอด .value_counts() ทำหน้าที่นี้ ตัวอย่างเช่น ด้านล่างคือนับจำนวนรายการที่ Outcome เป็นผู้ป่วยเบาหวาน (1) และจำนวนรายการที่ Outcome ไม่เป็นเบาหวาน (0)

df['Outcome'].value_counts()
Outcome
0    500
1    268
Name: count, dtype: int64

การเพิ่มอาร์กิวเมนต์ normalize จะคืนสัดส่วนแทนจำนวนจริง

df['Outcome'].value_counts(normalize=True)
Outcome
0    0.651042
1    0.348958
Name: proportion, dtype: float64


ปิดการจัดเรียงผลลัพธ์อัตโนมัติด้วยอาร์กิวเมนต์ sort (ค่าเริ่มต้นเป็น True) โดยค่าปริยายจะจัดเรียงตามจำนวนแบบมากไปน้อย

df['Outcome'].value_counts(sort=False)
Outcome
1    268
0    500
Name: count, dtype: int64

ยังสามารถใช้ .value_counts() กับอ็อบเจกต์ DataFrame และคอลัมน์ที่กำหนดภายในนั้นแทนการใช้กับคอลัมน์เดียวได้ ที่นี่เป็นตัวอย่างการใช้ value_counts() บน df พร้อมอาร์กิวเมนต์ subset ซึ่งรับลิสต์ของคอลัมน์

df.value_counts(subset=['Pregnancies', 'Outcome'])
Pregnancies  Outcome
1            0          106
2            0           84
0            0           73
3            0           48
4            0           45
0            1           38
5            0           36
6            0           34
1            1           29
3            1           27
7            1           25
4            1           23
8            1           22
5            1           21
7            0           20
2            1           19
9            1           18
6            1           16
8            0           16
10           0           14
             1           10
9            0           10
11           1            7
13           0            5
             1            5
12           0            5
11           0            4
12           1            4
14           1            2
15           1            1
17           1            1
Name: count, dtype: int64

การสรุปแบบจัดกลุ่มด้วย .groupby() ใน pandas

pandas ช่วยให้สรุปค่าโดยจัดกลุ่มตามค่าของคอลัมน์ที่กำหนดได้ สามารถทำได้โดยผสานเมธอด .groupby() เข้ากับเมธอดสรุปที่ต้องการ โค้ดด้านล่างแสดงค่าเฉลี่ยของคอลัมน์เชิงตัวเลขทั้งหมด โดยจัดกลุ่มตาม Outcome

df.groupby('Outcome').mean()

Aggregating data by one column in pandas

การสรุปข้อมูลโดยจัดกลุ่มตามหนึ่งคอลัมน์ใน pandas

.groupby() ยังรองรับการจัดกลุ่มด้วยมากกว่าหนึ่งคอลัมน์โดยส่งลิสต์ชื่อคอลัมน์ตามตัวอย่างด้านล่าง

df.groupby(['Pregnancies', 'Outcome']).mean()

Aggregating data by two columns in pandas

การสรุปข้อมูลโดยจัดกลุ่มตามสองคอลัมน์ใน pandas

สามารถใช้เมธอดสรุปใดๆ คู่กับ .groupby() ได้ เช่น .min(), .max(), .mean(), .median(), .sum() และอื่นๆ บทช่วยสอน pandas GroupBy ครอบคลุมการสรุปหลายรายการด้วย .agg() และรูปแบบอื่นๆ

ตารางพิวอต 

pandas ยังช่วยคำนวณสถิติสรุปเป็นตารางพิวอตได้ด้วย ทำให้สรุปจากการผสมผสานตัวแปรทำได้ง่าย โค้ดด้านล่างกำหนดแถวเป็นค่าที่ไม่ซ้ำของ Pregnancies คอลัมน์เป็นค่าที่ไม่ซ้ำของ Outcome และเซลล์เป็นค่าเฉลี่ยของ BMI ในกลุ่มที่สอดคล้องกัน

ตัวอย่างเช่น เมื่อ Pregnancies = 5 และ Outcome = 0 ค่า BMI เฉลี่ยจะเท่ากับ 31.1

pd.pivot_table(df, values="BMI", index='Pregnancies', 
               columns=['Outcome'], aggfunc='mean')
Outcome              0          1
Pregnancies                      
0            31.727397  39.213158
1            29.616038  37.793103
2            29.679762  34.578947
3            29.231250  32.548148
4            31.255556  33.873913
5            31.100000  36.780952
6            29.591176  31.775000
7            29.975000  34.756000
8            30.693750  32.204545
9            28.840000  33.300000
10           30.114286  31.380000
11           37.125000  39.385714
12           30.560000  34.575000
13           33.280000  36.720000
14                 NaN  35.100000
15                 NaN  37.100000
17                 NaN  40.900000

การสร้างภาพข้อมูลใน pandas

pandas มีตัวห่อฟังก์ชันพล็อตของ Matplotlib เพื่อให้การแสดงภาพ DataFrame ทำได้สะดวกยิ่งขึ้น ด้านล่างนี้เป็นตัวอย่างการทำภาพข้อมูลแบบทั่วไปด้วย pandas

กราฟเส้นใน pandas

pandas ให้สร้างกราฟเส้นเพื่อแสดงความสัมพันธ์ระหว่างตัวแปร ด้านล่างเป็นกราฟเส้นของ BMI และ Glucose เทียบกับดัชนีแถว

df[['BMI', 'Glucose']].plot.line()

Basic lineplot with pandas

กราฟเส้นพื้นฐานด้วย pandas

สามารถเลือกสีได้ด้วยอาร์กิวเมนต์ color

df[['BMI', 'Glucose']].plot.line(color={"BMI": "red", "Glucose": "blue"})

Basic line plot with pandas, with custom colors

กราฟเส้นพื้นฐานด้วย pandas พร้อมกำหนดสีเอง

คอลัมน์ทั้งหมดของ df สามารถพล็อตบนสเกลและแกนที่แยกกันได้ด้วยอาร์กิวเมนต์ subplots

df.plot.line(subplots=True)

Subplots for line plots with pandas

ซับพล็อตสำหรับกราฟเส้นด้วย pandas

กราฟแท่งใน pandas

สำหรับคอลัมน์ประเภทไม่ต่อเนื่อง สามารถใช้กราฟแท่งกับจำนวนของแต่ละหมวดหมู่เพื่อดูการกระจาย ด้านล่างเป็นการแสดงตัวแปร Outcome ที่มีค่าแบบไบนารี

df['Outcome'].value_counts().plot.bar()

Bar plot of Outcome counts in pandas

กราฟแท่งใน pandas

บ็อกซ์พล็อตใน pandas

การกระจายควอร์ไทล์ของตัวแปรเชิงต่อเนื่องสามารถดูได้ด้วยบ็อกซ์พล็อต โค้ดด้านล่างช่วยให้สร้างบ็อกซ์พล็อตด้วย pandas

df.boxplot(column=['BMI'], by='Outcome')

Boxplots in pandas
บ็อกซ์พล็อตใน pandas

ข้อคิดท้ายบท

ตอนนี้มีเวิร์กโฟลว์หลักของ pandas แล้ว: อ่านไฟล์เข้าสู่ DataFrame ตรวจสอบด้วย .head() .info() และ .describe() เลือกแถวด้วย .loc[] และ .iloc[] ทำความสะอาดค่าว่างและข้อมูลซ้ำ ผสานตาราง และสรุปผลด้วย .groupby() และ Pivot Table

หากเคยเรียน pandas มาก่อนปี 2026 มีนิสัยหนึ่งที่ควรเปลี่ยน: กำหนดค่าผลลัพธ์กลับแทนการส่ง inplace=True และทำการอัปเดตทุกครั้งด้วยการเรียก .loc[] เพียงครั้งเดียว วิธีที่เร็วที่สุดให้จำติดคือทำเวิร์กโฟลว์นี้ซ้ำกับชุดข้อมูลที่สนใจ แหล่งข้อมูลเหล่านี้จะช่วยต่อยอด:

คำถามที่พบบ่อยเกี่ยวกับ pandas

pandas ใน Python คืออะไร?

pandas เป็นไลบรารี Python แบบโอเพ่นซอร์สสำหรับทำงานกับข้อมูลเชิงตาราง โครงสร้างข้อมูลหลักสองแบบคือ DataFrame (ตาราง) และ Series (คอลัมน์เดี่ยว) มาพร้อมฟังก์ชันสำหรับนำเข้า ทำความสะอาด ปรับรูปแบบ สรุปผล และพล็อตข้อมูล จึงเป็นเครื่องมือมาตรฐานสำหรับการวิเคราะห์ข้อมูลใน Python

ทำไมควรเรียน pandas?

ถ้าทำงานกับข้อมูลใน Python pandas แทบจะเป็นสิ่งที่ต้องเรียน มันทำให้การจัดการและวิเคราะห์ข้อมูลง่ายขึ้น เพื่อโฟกัสกับการสกัดอินไซต์และสร้างคุณค่า ไม่ว่าจะเป็นชุดข้อมูลขนาดเล็กหรือขนาดใหญ่ pandas จะช่วยให้การทำงานง่ายขึ้นด้วยความเร็ว ความยืดหยุ่น และโครงสร้างข้อมูลที่ใช้งานเป็นมิตร

จะติดตั้ง pandas ได้อย่างไร?

รัน pip install pandas ในเทอร์มินัล หรือ conda install pandas หากใช้ conda pandas 3 ต้องการ Python 3.11 ขึ้นไป Anaconda มี pandas มาด้วยโดยค่าเริ่มต้น และ DataCamp's DataLab ติดตั้งไว้ล่วงหน้าแล้ว

โครงสร้างข้อมูลพื้นฐานใน pandas มีอะไรบ้าง?

โครงสร้างข้อมูลหลักสองอย่างใน pandas คือ Series และ DataFrame Series เปรียบได้กับคอลัมน์หนึ่งคอลัมน์ และ DataFrame คือ ตารางหลายมิติที่ประกอบด้วย Series หลายตัว โครงสร้างเหล่านี้ยืดหยุ่น สามารถเก็บข้อมูลได้หลายชนิด (เช่น จำนวนเต็ม สตริง ทศนิยม)

pandas เหมาะกับชุดข้อมูลขนาดใหญ่หรือไม่?

pandas จัดการข้อมูลระดับหลายล้านแถวได้สบาย ตราบใดที่ข้อมูลพอดีกับหน่วยความจำของเครื่อง หากข้อมูลไม่พอ ให้โหลดเป็นชุดย่อยด้วยอาร์กิวเมนต์ chunksize หรือเปลี่ยนไปใช้เครื่องมือสำหรับข้อมูลขนาดใหญ่กว่า เช่น Polars Dask หรือ PySpark

จะนำเข้าข้อมูลเข้าสู่ pandas ได้อย่างไร?

pandas อ่านข้อมูลได้จากหลายรูปแบบไฟล์ เช่น CSV, Excel, ฐานข้อมูล SQL, JSON และอื่น ๆ คำสั่ง pd.read_csv() pd.read_excel() pd.read_sql() และ pd.read_json() ใช้สำหรับนำเข้าข้อมูลจากไฟล์ประเภทที่สอดคล้องกัน ทั้งหมดนี้จะคืนค่าเป็น DataFrame ซึ่งสามารถจัดการต่อด้วย pandas ได้

pandas 3.0 มีอะไรเปลี่ยนไปบ้าง?

pandas 3.0 เปิดตัวในเดือนมกราคม 2026 ทำให้ Copy-on-Write เป็นค่าเริ่มต้น ดังนั้นซับเซตทุกตัวจึงทำงานเหมือนสำเนา และการกำหนดค่าซ้อนกัน เช่น df["col"][0] = x จะไม่อัปเดต DataFrame ต้นฉบับอีกต่อไป นอกจากนี้ยังอนุมานคอลัมน์ข้อความเป็นชนิดข้อมูล str โดยเฉพาะแทน object และต้องใช้ Python 3.11 ขึ้นไป ต่อมา pandas 3.1 เลิกใช้ inplace=True สำหรับเมธอดอย่าง dropna() และ sort_values()

ความแตกต่างระหว่าง loc และ iloc ใน pandas คืออะไร?

.loc[] เลือกแถวและคอลัมน์ด้วยฉลาก ในขณะที่ .iloc[] เลือกด้วยตำแหน่งเลขลำดับเริ่มจาก 0 ช่วง (slice) ก็แตกต่างกัน: .loc[100:110] รวมฉลากท้ายช่วงด้วย ส่วน .iloc[100:110] จะหยุดก่อนตำแหน่ง 110 ดูตัวอย่างเพิ่มเติมได้ที่ คู่มือ loc vs iloc

จะรวม DataFrame สองตัวใน pandas ได้อย่างไร?

ใช้ df1.merge(df2, on="key", how="left") เพื่อจอยน์ DataFrame สองตัวบนคอลัมน์ที่ใช้ร่วมกัน คล้ายกับการจอยน์ใน SQL อาร์กิวเมนต์ how เลือกชนิดการจอยน์ ("left" "right" "inner" หรือ "outer") หากต้องการวางซ้อน DataFrame แทน ให้ใช้ pd.concat()

หัวข้อ