Post

Pandas Cơ Bản

Pandas Cơ Bản

Pandas là thư viện Python quan trọng trong học AI, hỗ trợ xử lý và phân tích dữ liệu dễ dàng. Với các cấu trúc như DataFrame, Pandas giúp đọc, làm sạch, và biến đổi dữ liệu nhanh chóng, tạo nền tảng vững chắc cho các bước tiền xử lý và mô hình hóa dữ liệu trong AI.

1. Cách cài đặt Pandas

  • Bạn có thể gõ lệnh sau trong cmd sau khi tạo môi trường ảo để cài đặt thư viện Pandas:
1
pip install pandas
  • Dùng lệnh dưới và chạy trong một cell nếu bạn đang dùng Google Colab, Kaggle Notebook,…:
1
!pip install pandas

2. Các hàm cơ bản trong Pandas

  • Pandas là một thư viện nên chúng ta phải dùng lệnh import, dưới đây là một ví dụ:
1
2
3
4
5
6
7
import pandas
mydataset = {
    'cars': ["BMW", "Volvo", "Ford"],
    'passings': [3,7,2]
}
myvar = pandas.DataFrame(mydataset)
print(myvar)
 carspassings
0BMW3
1Volvo7
2Ford2
  • Người ta thường dùng pd để viết tắt cho pandas. Chúng ta có thể kiểm tra phiên bản pandas bằng câu lệnh:
1
2
import pandas as pd
print(pd.__version__)

2.2.2

Series trong Pandas

  • Một Series trong Pandas giống như một cột trong bảng. Nó là một mảng một chiều chứa dữ liệu thuộc bất kỳ loại nào. Ví dụ:
1
2
3
4
import pandas as pd
a = [1, 7, 2]
myvar = pd.Series(a)
myvar
01
17
22

dtype: int64

  • Bạn có thể truy cập vào chỉ số trong Series như sau:
1
2
3
4
import pandas as pd
a = [1, 7, 2]
myvar = pd.Series(a)
print(myvar[0])

1

  • Hoặc bạn có thể tự tạo nhãn như sau:
1
2
3
4
import pandas as pd
a = [1,7,2]
myvar = pd.Series(a, index = ["x", "y", "z"])
print(myvar["x"])

1

  • Bạn cũng có thể tạo sẵn từ điển và cho vào Series:
1
2
3
4
import pandas as pd
calories = {"day1": 420, "day2": 380, "day3": 390}
myvar = pd.Series(calories)
print(myvar)
day1420
day2380
day3390

dtype: int64

  • Bạn có thể chọn một số item trong từ điển, sử dụng index:
1
2
3
4
5
6
7
import pandas as pd

calories = {"day1": 420, "day2": 380, "day3": 390}

myvar = pd.Series(calories, index = ["day1", "day2"])

print(myvar)
day1420
day2380

dtype: int64

DataFrame trong Pandas

  • Các bộ dữ liệu trong Pandas thường là các bảng đa chiều, được gọi là DataFrames. Series giống như một cột, còn DataFrame là toàn bộ bảng:
1
2
3
4
5
6
7
import pandas as pd
data = {
  "calories": [420, 380, 390],
  "duration": [50, 40, 45]
}
df = pd.DataFrame(data)
print(df)
 CaloriesDuration
042050
138040
239045
  • Dùng hàm loc để lấy ra hàng được chỉ định, ví dụ dưới lấy ra hàng đầu tiên:
1
print(df.loc[0])
calories420
duration50
  • Giờ hãy thử lấy ra hai hàng đầu tiên:
1
df.loc[[0,1]]
 CaloriesDuration
042050
138040
  • Bạn có tạo ra index của riêng mình như code dưới:
1
2
3
4
5
6
7
import pandas as pd
data = {
  "calories": [420, 380, 390],
  "duration": [50, 40, 45]
}
df = pd.DataFrame(data, index = ["day1", "day2", "day3"])
print(df) 
 CaloriesDuration
day142050
day238040
day339045
1
print(df.loc["day1"])
 CaloriesDuration
day142050
day238040
  • Bạn có thể load file chứa data bằng pandas, ví dụ file của bạn dưới dạng .csv thì bạn có thể dùng lệnh sau:
1
2
3
import pandas as pd
df = pd.read_csv('data.csv')
print(df) 
DurationPulseMaxpulseCalories
60110130409.1
60117145479.0
60103135340.0
45109175282.4
45117148406.0
60105140290.8
60110145300.0
60115145310.2
75120150320.4
75125150330.4

169 rows × 4 columns

  • Bạn có thể tải file data.csv tại đây. Như bạn thấy thì khi bảng dữ liệu quá lớn, DataFrame chỉ hiện 5 hàng đầu và 5 hàng cuối. Bạn có thể xem DataFrame hiển thị được tối đa bao nhiêu hàng bằng lệnh:
1
2
import pandas as pd
print(pd.options.display.max_rows) 

60

  • Vậy mặc định là nếu như bảng chỉ có 60 hàng trở xuôngs thì DataFrame sẽ hiển thị hết, còn nếu quá số hàng kia thì nó sẽ hiển thị một phần như trên. Bạn có thể thay đổi tham số này như dưới:
1
2
3
4
import pandas as pd
pd.options.display.max_rows = 9999
df = pd.read_csv('data.csv')
print(df)
  • Bạn có thể in ra 3 hàng đầu tiên hoặc bao nhiêu hàng cũng được bằng hàm head:
1
print(df.head(3)) # nếu ko truyền số vào: df.head() sẽ lấy 5 hàng đầu tiên
DurationPulseMaxpulseCalories
60110130409.1
60117145479.0
60103135340.0
  • Để lấy các hàng cuối thì dùng hàm tail:
1
print(df.tail(3)) # nếu ko truyền số vào: df.tail() sẽ lấy 5 hàng cuối
DurationPulseMaxpulseCalories
60115145310.2
75120150320.4
75125150330.4
  • Bạn có thể xem thông tin cơ bản của data bằng hàm info:
1
print(df.info())

<class ‘pandas.core.frame.DataFrame’> RangeIndex: 169 entries, 0 to 168 Data columns (total 4 columns): Column Non-Null Count Dtype
— —— ————– —–
0 Duration 169 non-null int64
1 Pulse 169 non-null int64
2 Maxpulse 169 non-null int64
3 Calories 164 non-null float64 dtypes: float64(1), int64(3) memory usage: 5.4 KB None

  • Hãy để ý rằng hàm info nói cho chúng ta rất nhiều điều, như bạn thấy, data có 169 hàng và 4 cột, 3 cột đầu có kiểu dữ liệu là số nguyên, cột cuối có kiểu dữ liệu là số thực. Riêng cột Calories thì có 5 ô không có giá trị (164 non-null, tức chỉ có 164 ô có giá trị).

tại đây

Làm sạch Data trong Pandas

  • Làm sạch data có nghĩa là loại bỏ những data xấu trong data của bạn. Data xấu có thể là: ô bị trống, data không đúng format, data sai, data bị lặp,…
  • Giờ hãy thử tạo data mới bằng lệnh dưới đây:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import pandas as pd

# Dữ liệu
data = {
    "Duration": [60, 60, 60, 45, 45, 60, 60, 450, 30, 60, 60, 60, 60, 60, 60, 60, 60, 60, 45, 60, 45, 60, 45, 60, 45, 60, 60, 60, 60, 60, 60,60],
    "Date": ['2020/12/01', '2020/12/02', '2020/12/03', '2020/12/04', '2020/12/05', '2020/12/06', '2020/12/07', '2020/12/08', '2020/12/09', '2020/12/10', 
             '2020/12/11', '2020/12/12', '2020/12/12', '2020/12/13', '2020/12/14', '2020/12/15', '2020/12/16', '2020/12/17', '2020/12/18', '2020/12/19', 
             '2020/12/20', '2020/12/21', None, '2020/12/23', '2020/12/24', '2020/12/25', '2020/12/26', '2020/12/27', '2020/12/28', '2020/12/29', '2020/12/30', '2020/12/31'],
    "Pulse": [110, 117, 103, 109, 117, 102, 110, 104, 109, 98, 103, 100, 100, 106, 104, 98, 98, 100, 90, 103, 97, 108, 100, 130, 105, 102, 100, 92, 103, 100, 102,92],
    "Maxpulse": [130, 145, 135, 175, 148, 127, 136, 134, 133, 124, 147, 120, 120, 128, 132, 123, 120, 120, 112, 123, 125, 131, 119, 101, 132, 126, 120, 118, 132, 132, 129,115],
    "Calories": [409.1, 479.0, 340.0, 282.4, 406.0, 300.0, 374.0, 253.3, 195.1, 269.0, 329.3, 250.7, 250.7, 345.3, 379.3, 275.0, 215.2, 300.0, None, 323.0, 243.0, 364.2, 282.0, 300.0, 246.0, 334.5, 250.0, 241.0, None, 280.0, 380.3, 243.0]
}

df = pd.DataFrame(data)

df.head()
DurationDatePulseMaxpulseCalories
602020/12/01110130409.1
602020/12/02117145479.0
602020/12/03103135340.0
452020/12/04109175282.4
452020/12/05117148406.0
  • Nếu bạn hiển thị hết bảng này thì sẽ thấy có một vài ô ghi là NaN (Not a Number) hoặc là None. Ở hàng 7 thì cột Duration là 450, có thể coi đây là data sai. Hàng 11 và 12 thì giống hệt nhau, đây là bị lặp data.

Cách xử lý với trường hợp ô bị trống

  • Ô bị trống có thể cho bạn kết quả sai khi bạn phân tích dữ liệu. Một cách để xử lý là bạn có thể loại bỏ luôn hàng chứa ô trống đấy. Data thực tế thường khá lớn nên cứ yên tâm, bạn có thể vứt bỏ một số hàng. Dùng lệnh dropna để thực hiện:
1
2
new_df = df.dropna()
print(new_df)
  • Hãy thử kiểm tra xem, bảng data của bạn bây giờ trông thật sạch. Chú ý một điều là hàm dropna sẽ tạo ra một DataFrame mới, nếu như bạn muốn thay đổi bảng ban đầu thì hãy dùng tham số inplace = True:
1
2
df.dropna(inplace = True)
print(df)
  • Một cách khác để xử lý ô trống đó là chúng ta tự điền một giá trị vào đó. Hàm fillna() sẽ giúp bạn làm điều đó:
1
2
df.fillna(130, inplace = True)
print(df)
  • Như bạn thấy, nó thay hết tất cả ô trống thành giá trị 130. Có thể đây không phải là điều ta muốn, ví dụ cột Date phai có giá trị format theo thời gian. Chúng ta có thể điền vào ô trống của cột được chỉ định:
1
2
df["Calories"].fillna(130, inplace = True) # pandas 3.0 trở lên thì dùng df.fillna({"Calories":130}, inplace = True)
print(df)
  • Như bạn thấy, cột Calories không còn ô trống nữa. Nhưng thường thì người ta sẽ điền các ô trống theo giá trị trung bình, giá trị trung vị hay mode. Tượng trưng cho các hàm mean, median, mode, hoặc dùng các hàm max, min để chèn vào giá trị lớn nhất, nhỏ nhất:
1
2
3
x = df["Calories"].mean()
df["Calories"].fillna(x, inplace = True)
print(df)

Cách xử lý nếu như data bị sai format

  • Nếu cột Date của bạn có một vài ô bị sai format (kiểu 20201226), bạn có thể xem câu lệnh dưới đây:
1
2
3
df['Date'] = pd.to_datetime(df['Date'])

print(df)
  • Như bạn thấy. hàng 26 đã được fix như hàng 22 thì lại hiện NaT. Hãy dùng dropna để fix:
1
2
df.dropna(subset=['Date'], inplace = True)
print(df)

Cách xử lý với trường hợp data sai

  • Đôi khi bạn có thể nhận biết ô nào có thể bị sai khi nhìn vào các ô còn lại. Và tất nhiên có một số ô bị sai nhưng rất khó nhận ra, bạn phải là chuyên gia phân tích dữ liệu thì mới nhìn thấy. Một cách xử lý là thay thành giá trị bạn nghĩ là đúng, như bạn thấy thì hàng 7 ở cột Duration có giá trị là 450, khả năng cao là sai, giờ hãy sửa lại:
1
df.loc[7, 'Duration'] = 45 # thay thành giá trị 45
  • Với bảng data lớn. bạn không thể thay thủ công từng ô được, hãy xem câu lệnh dưới đây thay tất cả ô có giá trị lớn hơn 120 thành 120 trong cột Duration:
1
2
3
for x in df.index:
  if df.loc[x, "Duration"] > 120:
    df.loc[x, "Duration"] = 120
  • Một cách khác là xóa luôn cột đó:
1
2
3
for x in df.index:
  if df.loc[x, "Duration"] > 120:
    df.drop(x, inplace = True)

Cách xử lý với data bị trùng

  • Chúng ta có thể kiểm tra bảng data xem có bị trùng không bằng hàm duplicated:
1
print(df.duplicated()) # True là bị trùng, False là ko bị
  • Hãy dùng hàm drop_duplicates để xử lý data bị trùng, nó sẽ loại bỏ các hàng bị trùng:
1
2
df.drop_duplicates(inplace = True)
print(df)

3. Tổng kết

Pandas là công cụ không thể thiếu trong việc xử lý dữ liệu, đặc biệt trong học máy và AI. Với khả năng thao tác dữ liệu bảng nhanh chóng và hiệu quả, Pandas giúp chuẩn bị dữ liệu cho các mô hình AI, nâng cao độ chính xác và hiệu quả trong quá trình phân tích. Thành thạo Pandas là bước đầu quan trọng để học và phát triển các ứng dụng AI.

This post is licensed under CC BY 4.0 by the author.