keyboard_tabSkip to content
listPython Series

ทำความรู้จักกับ 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

bash
pip install pandas

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

python
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 สามารถเก็บข้อมูลประเภทเดียวกัน เช่น ตัวเลขทั้งหมด หรือข้อความทั้งหมด

ตัวอย่าง

python
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 เอง:

python
# สร้าง 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 ที่กำหนดขึ้นมาเพื่อดึงข้อมูลได้โดยตรง ไม่จำเป็นต้องใช้ตำแหน่งของข้อมูลที่เป็นตัวเลขเท่านั้น
python
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 ในการจัดการข้อมูลที่มีลำดับไม่แน่นอนหรือเป็นค่าที่มีความหมาย เช่น ชื่อ, หมวดหมู่, วันที่ เป็นต้น
python
# 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)
python
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 สามารถเลือกข้อมูลได้อย่างยืดหยุ่น โดยเราสามารถเลือกข้อมูลเฉพาะคอลัมน์หรือแถวตามต้องการได้ หรือ เลือกเฉพาะแถวออกมา
python
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 โดยกำหนดเงื่อนไขที่ต้องการ เช่น การเลือกแถวที่ตรงตามเงื่อนไขเฉพาะ
python
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. การเพิ่มคอลัมน์ใหม่
python
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 ได้ง่าย ๆ โดยการระบุข้อมูลที่ต้องการแก้ไข
python
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 มีฟังก์ชันสถิติเบื้องต้นที่สามารถช่วยในการวิเคราะห์ข้อมูล เช่น การหาค่าเฉลี่ย ค่าสูงสุด ค่าต่ำสุด เป็นต้น
python
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 รองรับการจัดกลุ่มข้อมูลตามคอลัมน์ต่าง ๆ แล้วทำการคำนวณค่าทางสถิติตามที่กำหนด เช่น การหาค่าเฉลี่ย, ผลรวม, หรือจำนวน
python
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()
python
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()
python
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 เราจะลองมาประยุกต์ใช้กับเคสที่มีการดึงข้อมูลเข้ามาจัดการกัน