ติดตั้ง 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()

ตัวอย่างการเปลี่ยนแปลงของ 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.tail(n = 10)

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

ดูค่าสถิติสรุปด้วย .describe()
ช่วยให้เห็นสเกล การเอียงกระจาย และช่วงของข้อมูลเชิงตัวเลขได้อย่างรวดเร็ว
ยังสามารถปรับควอร์ไทล์ได้ด้วยอาร์กิวเมนต์ percentiles ตัวอย่างนี้ดูเปอร์เซ็นไทล์ที่ 30%, 50% และ 70% ของคอลัมน์ตัวเลขใน DataFrame df
df.describe(percentiles=[0.3, 0.5, 0.7])

ดูค่าสถิติสรุปพร้อมเปอร์เซ็นไทล์ที่กำหนด
ยังสามารถเลือกสรุพ์เฉพาะชนิดข้อมูลที่ต้องการได้ด้วยอาร์กิวเมนต์ include ตัวอย่างนี้สรุปเฉพาะคอลัมน์ที่มีชนิดข้อมูลเป็น integer
df.describe(include=[int])

ค่าสถิติสรุปเฉพาะคอลัมน์ชนิดจำนวนเต็ม
ในทำนองเดียวกัน อาจต้องการตัดชนิดข้อมูลบางประเภทออกด้วยอาร์กิวเมนต์ 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

ทรานสโพสค่าสถิติสรุปด้วย .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)

จะเห็นว่าแถว 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]

การแยกหนึ่งแถวใน pandas
แยกสองแถวขึ้นไปด้วย [ ]
ในทำนองเดียวกัน สามารถคืนค่าสองแถวขึ้นไปได้โดยใช้เมธอด .isin() แทนตัวดำเนินการ ==
df[df.index.isin(range(2,10))]

การแยกแถวเฉพาะใน pandas
ใช้ .loc[] และ .iloc[] เพื่อดึงแถว
สามารถดึงแถวเฉพาะโดยอิงจากป้ายกำกับหรือเงื่อนไขด้วย .loc[] และ .iloc[] ("location" และ "integer location") โดย .loc[] ใช้ป้ายกำกับเพื่อชี้ไปยังแถว คอลัมน์ หรือเซลล์ ขณะที่ .iloc[] ใช้ตำแหน่งแบบตัวเลข คู่มือ loc vs iloc ของเราครอบคลุมความแตกต่างทั้งหมด เพื่อดูประเด็นหลักในที่นี้ จะเปลี่ยนดัชนีของ df2 ที่สร้างไว้ก่อนหน้าเพื่อให้ป้ายกำกับและตำแหน่งไม่ตรงกัน
![.loc[] selects by label, .iloc[] by position](https://media.datacamp.com/cms/pandas-02.png?w=802)
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]

การแยกแถวใน pandas ด้วย .loc[]
df2.iloc[100:110]
![Isolating rows in pandas with .loc[]](https://media.datacamp.com/legacy/v1668597143/image28_07af2245c8.png?w=724)
การแยกแถวใน pandas ด้วย .iloc[]
ยังสามารถทำชุดย่อยด้วย .loc[] และ .iloc[] โดยใช้ลิสต์แทนการใช้ช่วง
df2.loc[[100, 200, 300]]
![Isolating rows using a list in pandas with .loc[]](https://media.datacamp.com/legacy/v1668597142/image31_c5acf2a9bd.png?w=723)
การแยกแถวด้วยลิสต์ใน pandas ด้วย .loc[]
df2.iloc[[100, 200, 300]]
![Rows at positions 100, 200, and 300 selected with .iloc[]](https://media.datacamp.com/legacy/v1668597142/image25_36fb2e17e1.png?w=802)
การแยกแถวด้วยลิสต์ใน 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]

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

การแยกแถวตามเงื่อนไขใน 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()

พิมพ์ค่าฐานนิยมของคอลัมน์ใน 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()

สร้างคอลัมน์ใหม่จากคอลัมน์ที่มีอยู่ใน 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()

การสรุปข้อมูลโดยจัดกลุ่มตามหนึ่งคอลัมน์ใน pandas
.groupby() ยังรองรับการจัดกลุ่มด้วยมากกว่าหนึ่งคอลัมน์โดยส่งลิสต์ชื่อคอลัมน์ตามตัวอย่างด้านล่าง
df.groupby(['Pregnancies', 'Outcome']).mean()

การสรุปข้อมูลโดยจัดกลุ่มตามสองคอลัมน์ใน 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()

กราฟเส้นพื้นฐานด้วย pandas
สามารถเลือกสีได้ด้วยอาร์กิวเมนต์ color
df[['BMI', 'Glucose']].plot.line(color={"BMI": "red", "Glucose": "blue"})

กราฟเส้นพื้นฐานด้วย pandas พร้อมกำหนดสีเอง
คอลัมน์ทั้งหมดของ df สามารถพล็อตบนสเกลและแกนที่แยกกันได้ด้วยอาร์กิวเมนต์ subplots
df.plot.line(subplots=True)

ซับพล็อตสำหรับกราฟเส้นด้วย pandas
กราฟแท่งใน pandas
สำหรับคอลัมน์ประเภทไม่ต่อเนื่อง สามารถใช้กราฟแท่งกับจำนวนของแต่ละหมวดหมู่เพื่อดูการกระจาย ด้านล่างเป็นการแสดงตัวแปร Outcome ที่มีค่าแบบไบนารี
df['Outcome'].value_counts().plot.bar()

กราฟแท่งใน pandas
บ็อกซ์พล็อตใน pandas
การกระจายควอร์ไทล์ของตัวแปรเชิงต่อเนื่องสามารถดูได้ด้วยบ็อกซ์พล็อต โค้ดด้านล่างช่วยให้สร้างบ็อกซ์พล็อตด้วย pandas
df.boxplot(column=['BMI'], by='Outcome')

บ็อกซ์พล็อตใน pandas
ข้อคิดท้ายบท
ตอนนี้มีเวิร์กโฟลว์หลักของ pandas แล้ว: อ่านไฟล์เข้าสู่ DataFrame ตรวจสอบด้วย .head() .info() และ .describe() เลือกแถวด้วย .loc[] และ .iloc[] ทำความสะอาดค่าว่างและข้อมูลซ้ำ ผสานตาราง และสรุปผลด้วย .groupby() และ Pivot Table
หากเคยเรียน pandas มาก่อนปี 2026 มีนิสัยหนึ่งที่ควรเปลี่ยน: กำหนดค่าผลลัพธ์กลับแทนการส่ง inplace=True และทำการอัปเดตทุกครั้งด้วยการเรียก .loc[] เพียงครั้งเดียว วิธีที่เร็วที่สุดให้จำติดคือทำเวิร์กโฟลว์นี้ซ้ำกับชุดข้อมูลที่สนใจ แหล่งข้อมูลเหล่านี้จะช่วยต่อยอด:
- [Cheat Sheets] แผ่นสรุป Python และ pandas มากมายสำหรับอ้างอิงขณะเรียนรู้
- [Live trainings] เซสชันโค้ดตามสดฟรี หลายรายการใช้ pandas
- [คอร์ส] Data Manipulation with pandas และ Joining Data with pandas สำหรับการฝึกแบบโต้ตอบ
- [เตรียมสัมภาษณ์] คำถามสัมภาษณ์ pandas ยอดนิยม เพื่อทดสอบความรู้
- [บทความสอนเพิ่มเติม] ดูบทความที่เหลือเกี่ยวกับ pandas และระบบนิเวศ PyData รวมถึง การทำค่าเฉลี่ยเคลื่อนที่ใน pandas และ การใช้เมธอด .apply() ของ pandas
คำถามที่พบบ่อยเกี่ยวกับ 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()
pandas เป็นแพ็กเกจมาตรฐานของ Python สำหรับการวิเคราะห์ข้อมูล โดยมีการดาวน์โหลดมากกว่า 500 ล้านครั้งต่อเดือนบน PyPI รองรับการอ่านและเขียนไฟล์ CSV, Excel, JSON, SQL และฟอร์แมตอื่น ๆ อีกมากมาย และมีฟังก์ชันครอบคลุมงานประจำวันในการทำความสะอาด ปรับโครงสร้าง สรุปเชิงสถิติ และวาดกราฟข้อมูลในรูปแบบตาราง
ในบทเรียน pandas นี้ จะพาเดินผ่านเวิร์กโฟลว์ทั้งหมดด้วยข้อมูลจริงหนึ่งชุด: การติดตั้ง pandas การนำเข้าและส่งออกข้อมูล การตรวจสอบ DataFrame การเลือกและกรองแถว การจัดการค่าว่างและข้อมูลซ้ำ การผสานตาราง การคำนวณสรุปเชิงสถิติ และการวาดกราฟ ทุกตัวอย่างทำงานบน pandas 3.1 ซึ่งเป็นรุ่นปัจจุบัน และระบุจุดเปลี่ยนแปลงใน pandas 3 ที่ทำให้โค้ดจากบทเรียนเก่าบางส่วนใช้ไม่ได้
ต้องมีพื้นฐาน Python เล็กน้อยและไม่จำเป็นต้องเคยใช้ pandas มาก่อน ถ้าต้องการแผนการเรียนที่ยาวขึ้น ดูโพสต์เรื่อง วิธีเรียนรู้ pandas และสำหรับการฝึกแบบโต้ตอบ ดูคอร์ส Data Manipulation with pandas
สรุปสั้น ๆ
pip install pandas; pandas 3 ต้องใช้ Python 3.11 ขึ้นไป.loc[]เลือกตามป้ายกำกับ.iloc[]เลือกตามตำแหน่ง.loc[]ครั้งเดียวdf = df.dropna()) แทนการใช้inplace=Trueที่เลิกใช้แล้วpandas คืออะไร?
pandas คือแพ็กเกจสำหรับปรับแต่งและประมวลผลข้อมูลแบบตารางใน Python กล่าวคือข้อมูลในรูปแบบแถวและคอลัมน์ หรือที่เรียกว่า DataFrame โดยสัญชาตญาณสามารถนึกภาพ DataFrame เป็นแผ่นงาน Excel ได้
ความสามารถของ pandas รวมถึงการแปลงข้อมูล เช่น การเรียงลำดับแถว และการเลือกบางส่วน การคำนวณค่าสถิติสรุปอย่างค่าเฉลี่ย การปรับรูปทรง DataFrame และการเชื่อม DataFrame เข้าด้วยกัน pandas ทำงานได้ดีกับแพ็กเกจข้อมูลของ Python อื่น ๆ ที่ได้รับความนิยม ซึ่งโดยรวมเรียกว่า PyData ecosystem ได้แก่
pandas ใช้ทำอะไรบ้าง?
pandas ถูกใช้ตลอดกระบวนการวิเคราะห์ข้อมูล ด้วย pandas สามารถ:
pandas ยังมีฟังก์ชันสำหรับการวิเคราะห์อนุกรมเวลาและการวิเคราะห์ข้อมูลข้อความด้วย
ประโยชน์สำคัญของ pandas
pandas มีข้อได้เปรียบเชิงปฏิบัติสำหรับงานข้อมูลประจำวัน 5 ประการ:
วิธีติดตั้ง pandas
ก่อนใช้งาน pandas ต้องติดตั้งก่อน สามารถข้ามขั้นตอนนี้ได้โดยสมัครบัญชี DataCamp ฟรี และใช้ DataLab ซึ่งเป็น IDE บนคลาวด์ที่มาพร้อม pandas (และแพ็กเกจข้อมูลของ Python ชั้นนำ) ติดตั้งไว้ล่วงหน้า