Skip to main content

ทำความรู้จักกับ Pandas

Pandas เป็น library ใน Python ที่ถูกพัฒนาขึ้นเพื่อใช้ในการจัดการและวิเคราะห์ข้อมูล โดยเฉพาะข้อมูลที่อยู่ในรูปแบบตาราง (tabular data) Pandas ใช้โครงสร้างข้อมูลหลักสองแบบคือ Series และ DataFrame ซึ่งทำให้สามารถจัดการข้อมูลในรูปแบบตารางที่มีแถวและคอลัมน์ได้อย่างมีประสิทธิภาพ

Pandas ได้รับความนิยมอย่างมากในงานด้าน Data Science และ Data Analysis เนื่องจากมีความสามารถในการจัดการข้อมูลได้อย่างยืดหยุ่นและรองรับการทำงานกับข้อมูลขนาดใหญ่ได้เป็นอย่างดี

ความสามารถหลักของ Pandas

  1. จัดการข้อมูลในรูปแบบตาราง (DataFrame): คล้ายกับการทำงานในโปรแกรม Excel โดย DataFrame จะช่วยให้สามารถจัดการข้อมูลในแต่ละแถวและคอลัมน์ได้อย่างง่ายดาย
  2. การอ่านและเขียนข้อมูล: Pandas สามารถอ่านข้อมูลจากหลายแหล่ง เช่น ไฟล์ CSV, Excel, SQL, JSON และเขียนข้อมูลกลับไปยังรูปแบบเหล่านั้นได้
  3. การจัดการข้อมูลที่ขาดหาย (Missing Data): มีเครื่องมือจัดการกับข้อมูลที่ขาดหายหรือเป็น NaN อย่างสะดวก
  4. การเลือกและกรองข้อมูล (Data Selection and Filtering): Pandas สามารถเลือกข้อมูลจากตารางได้ตามเงื่อนไขที่กำหนด เช่น เลือกแถวที่มีค่ามากกว่า หรือน้อยกว่า ค่าใดค่าหนึ่ง
  5. การจัดกลุ่มข้อมูล (Grouping): ช่วยในการจัดกลุ่มข้อมูลตามคอลัมน์และทำการคำนวณ เช่น การหาค่าเฉลี่ยในแต่ละกลุ่ม
  6. การรวมข้อมูล (Merging/Joining): มีฟังก์ชันในการรวมข้อมูลจากหลายตาราง (คล้ายกับการทำงานใน SQL)
  7. การทำงานร่วมกับ Numpy: Pandas ถูกออกแบบมาให้สามารถทำงานร่วมกับ Numpy ได้อย่างราบรื่น

ซึ่งก็เหมือนกันกับ numpy วิธีใช้งาน pandas เริ่มต้นจะต้องลง library pandas ก่อนด้วยคำสั่ง pip

pip install pandas

จากนั้น เราจะมาลองสร้าง DataFrame ง่ายๆกันก่อนด้วย code ชุดนี้เพื่อยืนยันว่า library pandas สามารถใช้งานได้

import pandas as pd

# สร้าง DataFrame จากดิกชันนารี
data = {'Name': ['John', 'Anna', 'Peter'],
'Age': [28, 24, 35],
'City': ['New York', 'London', 'Berlin']}
df = pd.DataFrame(data)

print(df)

หากได้ผลลัพธ์ตามนี้มาถือว่า ถูกต้องแล้วเรียบร้อย

    Name  Age      City
0 John 28 New York
1 Anna 24 London
2 Peter 35 Berlin

ก่อนที่เราจะไปกันต่อ เราจะมารู้จักกับข้อมูล 2 ประเภทของ Pandas กันก่อนนั่นคือ DataFrame กับ Series กัน

Dataframe กับ Series

เริ่มต้นจาก Series กันก่อน

1. Series

  • Series เป็นโครงสร้างข้อมูลแบบหนึ่งมิติใน Pandas ที่เก็บข้อมูลในรูปแบบลำดับ (sequence) ซึ่งคล้ายกับ list ใน Python แต่มีฟีเจอร์พิเศษเพิ่มเติม เช่น การกำหนด index ให้กับข้อมูลแต่ละรายการ
  • Series สามารถเก็บข้อมูลประเภทเดียวกัน เช่น ตัวเลขทั้งหมด หรือข้อความทั้งหมด

ตัวอย่าง

import pandas as pd

# สร้าง Series จากลิสต์ของตัวเลข
s = pd.Series([10, 20, 30, 40, 50])

print(s)

ผลลัพธ์

0    10
1 20
2 30
3 40
4 50
dtype: int64

ในตัวอย่างนี้ Series จะมีค่า index ตั้งแต่ 0 ถึง 4 โดยอัตโนมัติ และค่าที่เก็บใน Series คือ 10, 20, 30, 40, 50

  • index: คอลัมน์ด้านซ้ายคือดัชนี (index) ซึ่งสามารถกำหนดเองได้หากต้องการ
  • value: คอลัมน์ด้านขวาคือค่าที่เก็บใน Series

การสร้าง Series โดยกำหนด index เอง:

# สร้าง Series พร้อมกำหนด index
s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])

print(s)

ผลลัพธ์

a    10
b 20
c 30
dtype: int64

ในตัวอย่างนี้ Series มี index เป็น 'a', 'b', 'c' แทนที่จะเป็นตัวเลขอัตโนมัติ

เป้าหมายของการทำ Index ใน Series

  1. การระบุและเข้าถึงข้อมูลได้ง่ายขึ้น Index ใน Series ทำหน้าที่เหมือนกับตัวชี้หรือตัวระบุ (identifier) ให้กับแต่ละค่าข้อมูลใน Series ดังนั้น เมื่อเราต้องการเข้าถึงข้อมูลใน Series เราสามารถใช้ index ที่กำหนดขึ้นมาเพื่อดึงข้อมูลได้โดยตรง ไม่จำเป็นต้องใช้ตำแหน่งของข้อมูลที่เป็นตัวเลขเท่านั้น
import pandas as pd

# สร้าง Series พร้อมกำหนด index
s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])

# เข้าถึงข้อมูลด้วย index
print(s['b']) # ผลลัพธ์: 20
  1. รองรับข้อมูลที่ไม่เป็นลำดับ (Non-Sequential Data) Series ใน Pandas สามารถมี index ที่ไม่ได้เป็นเพียงตัวเลขเรียงลำดับ (sequential) เช่น 0, 1, 2 แต่สามารถเป็นค่าที่ระบุเอง เช่น ข้อความหรือวันที่ ทำให้สามารถใช้ Pandas ในการจัดการข้อมูลที่มีลำดับไม่แน่นอนหรือเป็นค่าที่มีความหมาย เช่น ชื่อ, หมวดหมู่, วันที่ เป็นต้น
# Series ที่มี index เป็นวันที่
s = pd.Series([100, 200, 150], index=['2023-09-01', '2023-09-02', '2023-09-03'])

# เข้าถึงข้อมูลวันที่ 2023-09-02
print(s['2023-09-02']) # ผลลัพธ์: 200
  1. การรวมข้อมูลจากหลายแหล่ง (Data Alignment) Index ช่วยในเรื่องของการรวมข้อมูลจาก Series หรือ DataFrame หลายตัว โดย Pandas จะใช้ index ในการจัดการและรวมข้อมูลได้อัตโนมัติ หาก index ของ Series สองตัวที่นำมารวมกันไม่ตรงกัน Pandas จะจัดการให้เองโดยเพิ่มข้อมูลที่หายไป (NaN)
s1 = pd.Series([100, 200, 300], index=['a', 'b', 'c'])
s2 = pd.Series([150, 250], index=['a', 'b'])

# การรวมข้อมูลโดยใช้ index
combined = s1 + s2
print(combined)

ผลลัพธ์

a    250.0
b 450.0
c NaN
dtype: float64

2. DataFrame

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

ตัวอย่าง DataFrame ก็จะเป็นตัวอย่าง code แรกสุดที่เรายกตัวอย่างกันไป

โดย use case ของการใช้ DataFrame โดยทั่วไป จะมีดังต่อไปนี้

  1. เลือก row และ column ที่ต้องการ DataFrame สามารถเลือกข้อมูลได้อย่างยืดหยุ่น โดยเราสามารถเลือกข้อมูลเฉพาะคอลัมน์หรือแถวตามต้องการได้ หรือ เลือกเฉพาะแถวออกมา
import pandas as pd

# สร้าง DataFrame จากดิกชันนารี
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'Los Angeles', 'Chicago']}

df = pd.DataFrame(data)

# เลือกคอลัมน์ 'Name'
print(df['Name'])

# เลือกแถวที่มี index 1
print(df.loc[1])

ผลลัพธ์

0      Alice
1 Bob
2 Charlie
Name: Name, dtype: object
Name Bob
Age 30
City Los Angeles
Name: 1, dtype: object

Note

  • .loc เป็นการอ้างถึงแถวหรือคอลัมน์ใน DataFrame ของ Pandas โดยใช้ label-based indexing ซึ่งหมายความว่าเราสามารถเข้าถึงข้อมูลโดยใช้ label ของ index หรือชื่อของคอลัมน์
  1. การกรองข้อมูลตามเงื่อนไข เราสามารถกรองข้อมูลใน DataFrame โดยกำหนดเงื่อนไขที่ต้องการ เช่น การเลือกแถวที่ตรงตามเงื่อนไขเฉพาะ
import pandas as pd

# สร้าง DataFrame จากดิกชันนารี
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'Los Angeles', 'Chicago']}

df = pd.DataFrame(data)

# เลือกแถวที่คอลัมน์ 'Age' มากกว่า 30
filtered_df = df[df['Age'] > 30]

print(filtered_df)

ผลลัพธ์

      Name  Age     City
2 Charlie 35 Chicago
  1. การเพิ่มคอลัมน์ใหม่
import pandas as pd

# สร้าง DataFrame จากดิกชันนารี
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'Los Angeles', 'Chicago']}

df = pd.DataFrame(data)

# เลือกแถวที่คอลัมน์ 'Age' มากกว่า 30
filtered_df = df[df['Age'] > 30]

print(filtered_df)

ผลลัพธ์

      Name  Age         City  Salary
0 Alice 25 New York 70000
1 Bob 30 Los Angeles 80000
2 Charlie 35 Chicago 120000
  1. การแก้ไขข้อมูล Pandas ช่วยให้เราสามารถแก้ไขข้อมูลภายใน DataFrame ได้ง่าย ๆ โดยการระบุข้อมูลที่ต้องการแก้ไข
import pandas as pd

# สร้าง DataFrame จากดิกชันนารี
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'Los Angeles', 'Chicago']}

df = pd.DataFrame(data)

# แก้ไขค่าของ City ในแถวที่มี index 0
df.at[0, 'City'] = 'San Francisco'

print(df)

ผลลัพธ์

      Name  Age           City
0 Alice 25 San Francisco
1 Bob 30 Los Angeles
2 Charlie 35 Chicago
  1. การคำนวณสถิติเบื้องต้น DataFrame มีฟังก์ชันสถิติเบื้องต้นที่สามารถช่วยในการวิเคราะห์ข้อมูล เช่น การหาค่าเฉลี่ย ค่าสูงสุด ค่าต่ำสุด เป็นต้น
import pandas as pd

# สร้าง DataFrame จากดิกชันนารี
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'Los Angeles', 'Chicago']}

df = pd.DataFrame(data)

# คำนวณค่าเฉลี่ยของคอลัมน์ Age
average_age = df['Age'].mean()

print(f"Average Age: {average_age}") # Average Age: 30.0
  1. Grouping Data Pandas รองรับการจัดกลุ่มข้อมูลตามคอลัมน์ต่าง ๆ แล้วทำการคำนวณค่าทางสถิติตามที่กำหนด เช่น การหาค่าเฉลี่ย, ผลรวม, หรือจำนวน
import pandas as pd

# สร้าง DataFrame จากดิกชันนารี
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'Los Angeles', 'Chicago']}

df = pd.DataFrame(data)

# เพิ่มคอลัมน์ 'Salary'
df['Salary'] = [70000, 80000, 120000]
# จัดกลุ่มตาม City และหาค่าเฉลี่ยของ Salary
grouped = df.groupby('City')['Salary'].mean()

print(grouped)

ผลลัพธ์

City
Chicago 120000.0
Los Angeles 80000.0
New York 70000.0
Name: Salary, dtype: float64
  1. การลบคอลัมน์หรือแถว เราสามารถลบคอลัมน์หรือแถวที่ไม่ต้องการได้โดยใช้คำสั่ง drop()
import pandas as pd

# สร้าง DataFrame จากดิกชันนารี
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'Los Angeles', 'Chicago']}

df = pd.DataFrame(data)

# ลบคอลัมน์ City
df = df.drop(columns=['City'])

print(df)

ผลลัพธ์

      Name  Age
0 Alice 25
1 Bob 30
2 Charlie 35
  1. การเปลี่ยนชื่อคอลัมน์ เราสามารถเปลี่ยนชื่อคอลัมน์ใน DataFrame ได้โดยใช้ฟังก์ชัน rename()
import pandas as pd

# สร้าง DataFrame จากดิกชันนารี
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'Los Angeles', 'Chicago']}

df = pd.DataFrame(data)

# เปลี่ยนชื่อคอลัมน์ Age เป็น Years
df = df.rename(columns={'Age': 'Years'})

print(df)

ผลลัพธ์

      Name  Years         City
0 Alice 25 New York
1 Bob 30 Los Angeles
2 Charlie 35 Chicago

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

ทีนี้ อันนี้เป็นเพียงพื้นฐานคำสั่งของ Series กับ DataFrame เราจะลองมาประยุกต์ใช้กับเคสที่มีการดึงข้อมูลเข้ามาจัดการกัน