You are on page 1of 80

3/7/2022

Bộ môn Toán kinh tế


Học phần: KHOA HỌC DỮ LIỆU CHO KINH DOANH

CHƯƠNG 1. XỬ LÝ DỮ LIỆU VỚI PANDAS


ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Giới thiệu
Cấu trúc dữ liệu trong pandas
Dữ liệu chuỗi (Series) + Các hàm cơ bản trong pandas (1)
Làm việc với khung dữ liệu (DataFrame) + Các hàm cơ bản trong pandas (2)
Thống kê dùng pandas
Đánh chỉ mục
Thao tác dữ liệu
Xử lý dữ liệu khuyết
Trộn và Gộp dữ liệu
Làm sạch và chuyển đổi dữ liệu
Thu gom và nhóm dữ liệu
Xử lý văn bản trong pandas
Options và Customize
Pandas ứng dụng cho phân tích dữ liệu (bài toán thực tế)

NỘI DUNG BÀI HỌC

1
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

1. Giới thiệu

Pandas là một thư viện mã nguồn mở được phát triển bởi Wes McKinney vào
năm 2008. Thư viện này được xây dựng dựa trên ngôn ngữ lập trình Python và
có thể được sử dụng cho bất kỳ quy trình thu thập thông tin chi tiết từ dữ liệu
nào.
Pandas được sử dụng chủ yếu để thao tác, phân tích và dọn dẹp dữ liệu.
Pandas cung cấp rất nhiều cấu trúc dữ liệu cũng như các phép tính hỗ trợ thao
tác dữ liệu số và dữ liệu thời gian (time series).
Trong nghiên cứu khoa học dữ liệu, Pandas là một trong những công cụ quan
trọng trong việc hỗ trợ, xử lý và phân tích dữ liệu với mã nguồn mở nhanh,
mạnh, linh hoạt và dễ sử dụng,

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Ưu điểm của Pandas

Nhanh và hiệu quả trong thao tác và phân tích dữ liệu.


Có thể lấy dữ liệu từ nhiều nguồn dữ liệu khác nhau.
Dễ dàng xử lí các dữ liệu bị thiếu (đại diện bởi: NaN).
Kích thước linh hoạt: có thể dễ dàng insert và delete dữ liệu.
Linh hoạt trong việc reshape và pivot dataset.
Cung cấp các chức năng time-series cũng như các chức năng nhóm dữ liệu (group).
Các công cụ I/O mạnh để tải dữ liệu từ các tệp phẳng (flat file) như CSV và delimited, tệp
Excel, cơ sở dữ liệu và lưu / tải dữ liệu từ định dạng HDF5 nhanh
Tích hợp tốt với các thư viện khác của python như SciPy, Matplotlib, Plotly, v.v.
Hiệu suất tốt

2
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Sử dụng Pandas để làm gì ?

Thông qua thư viện Pandas, giúp người dung có thể làm quen với các dữ liệu đang có trước khi tiến hành
mô hình hóa các hình ảnh trực quan phức tạp, bằng các thao tác như sắp xếp, phân tích và biến đổi
chúng.
Ví dụ: Khi cần khám phá tập dữ liệu được lưu trữ trong CSV trên máy tính, Pandas sẽ trích xuất dữ liệu từ CSV đó vào
DataFrame, một bảng tập hợp dữ liệu cho phép làm những việc như:
Tính toán số liệu thống kê, trả lời các câu hỏi về dữ liệu như giá trị trung bình, tối đa, tối thiểu của mỗi cột. Cột A có tương quan
với cột B không? Sự phân bố dữ liệu trong cột C trông như thế nào?...
Làm sạch dữ liệu bằng cách thực hiện những việc như xóa các giá trị bị thiếu và lọc các hàng và cột theo một số tiêu chí.
Trực quan hóa dữ liệu với sự trợ giúp từ Matplotlib, biểu đồ thanh, đường kẻ, biểu đồ,....
Lưu trữ các dữ liệu đã được làm sạch, chuyển đổi chúng thành CSV, tệp hoặc các cơ sở dữ liệu.

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Cài đặt thư viện Pandas

pip install pandas

“pandas” là thư viện mở rộng từ numpy, chuyên để xử lý dữ liệu cấu trúc dạng bảng
Tên “pandas” là dạng số nhiều của “panel data”

3
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Khai báo thư viện Pandas

import pandas as pd
import numpy as np
# numpy thường được import kèm pandas

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

2. Cấu trúc dữ liệu trong pandas

Dữ liệu của pandas có 3 cấu trúc chính:


Series: cấu trúc 1 chiều, mảng dữ liệu đồng nhất, có kích thước cố định
DataFrame: cấu trúc 2 chiều, dữ liệu trên các cột là đồng nhất (có phần giống như
table trong SQL, nhưng với các dòng được đặt tên). Kích thước có thể thay đổi
được với các cột đã được tạo không đồng nhất.
Panel: cấu trúc 3 chiều, có thể xem như một tập các dataframe với thông tin bổ
sung, kích thước có thể thay đổi được.
Panel từng là một cấu trúc dữ liệu trong pandas nhưng đã bị gỡ bỏ từ phiên bản 0.25 (SV có
thể tham khảo về panel ở phiên bản 0.24)

4
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Series (1 chiều)

Dữ liệu series gần giống kiểu array trong Numpy, nhưng có 2 điểm khác biệt quan trọng:
Chấp nhận dữ liệu thiếu (NaN – không xác định)
Hệ thống chỉ mục phong phú (giống dictionary?)
Ví dụ: chuỗi các số nguyên

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

DataFrame (2 chiều)

Dữ liệu 2 chiều
Các cột có tên
Dữ liệu trên cột là đồng nhất (series?), nhưng giữa các cột có thể không đồng nhất
Các dòng có thể có tên
Có thể có ô thiếu dữ liệu

Ví dụ: hình trên cho thấy dữ liệu là đồng nhất trong một cột nhưng có thể không đồng nhất giữa các cột, cột
“Country” và “Capital” là kiểu string (chuỗi) trong khi “Area” và ‘Population’ là kiểu integer (số nguyên)

10

5
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Panel (3 chiều)

Dữ liệu 3 chiều
Một tập các dataframe
Các dataframe có cấu trúc tương đồng
Có thể có các thông tin bổ sung cho từng dataframe
Panel rất khó để đại diện cho bảng để biểu diễn đồ họa

11

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

3. Dữ liệu chuỗi (Series)

Series là một đối tượng giống mảng một chiều.


Series có khả năng giữ bất kỳ loại dữ liệu nào, ví dụ: Số nguyên, floats, strings, các đối tượng Python, ….
Series có thể được xem như là một cấu trúc dữ liệu với hai mảng: một lưu chỉ mục, cái còn lại lưu dữ liệu.
Series có thể được tạo ra bằng cách sử dụng phương thức sau:
pandas.Series( data=None, index=None, dtype=None, copy=False)
Trong đó:
data có thể là list, dictionary hoặc hằng số.
index là tập các giá trị chỉ mục duy nhất có thể băm và độ dài len(index) bằng với len(data).
dtype là kiểu dữ liệu của đối số data.
copy có giá trị True/False, mặc định là False. Copy input data.

12

6
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Tạo dữ liệu series từ danh sách (giá trị ngẫu nhiên)

import pandas as pd
import numpy as np

S = pd.Series(np.random.randint(100, size = 4))

print(S)

# trực tiếp lấy thông tin các chỉ mục và giá trị của Series S
print(S.index)

print(S.values)

13

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Tạo dữ liệu series từ gán các Object

import pandas as pd
import numpy as np

chi_so = ["Ke toan", "Kinh Te", "CNTT", “Ngan hang"]


gia_tri = [310, 360, 580, 340]
S = pd.Series(gia_tri, index=chi_so)

print(S)

print(S.index)

print(S.values)

14

7
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Tạo dữ liệu series từ gán các Object (tt)

Tạo dữ liệu series (3)

import pandas as pd
import numpy as np

chi_so = [“KTKT", “KTKT", "CNTT", “TC“]


gia_tri = [310, 360, 580, 340]
S = pd.Series(gia_tri, index=chi_so)

print(S)

print(S.index)

print(S.values)

15

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Truy vấn dữ liệu thông qua chỉ số

import pandas as pd
import numpy as np

chi_so = [“KTKT", “KTKT", "CNTT", “TC"] # trùng nhau


gia_tri = [310, 360, 580, 340]
S = pd.Series(gia_tri, index=chi_so)

print(S[‘KTKT’])

print(S[‘CNTT’])

print(S.TC)

16

8
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Phép toán trên series

import pandas as pd
import numpy as np

chi_so = ["KTKT","KTKT","CNTT","TC"]
# chỉ số giống nhau thì tính gộp, nếu không thì NaN
gia_tri = [310, 360, 580, 340]
S = pd.Series(gia_tri, index=chi_so)
P = pd.Series([100, 100],["CNTT","Ngan hang"])
Y = S + P

print(Y)

17

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Phép toán trên series

Nguyên tắc chung của việc thực hiện phép toán trên series như sau:
Nếu là phép toán giữa 2 series, thì các giá trị cùng chỉ số sẽ thực hiện phép
toán với nhau, trường hợp không có giá trị ở cả 2 series thì trả về NaN
Nếu là phép toán giữa series và 1 số, thì thực hiện phép toán trên số đó với
tất cả các giá trị trong series

Các phép toán trên series: + , - , * (nhân) , / , ** (lũy thừa) , …

18

9
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

5.(1) Các hàm cơ bản trong pandas series (S)

S.axes: trả về danh sách các chỉ mục của S


S.dtype: trả về kiểu dữ liệu các phần tử của S
S.empty: kiểm tra xem dữ liệu có empty không, trả về True nếu S rỗng
S.ndim: trả về chiều của dữ liệu của S, theo định nghĩa nó là 1
S.size: trả về số lượng phần tử có trong dữ liệu series S
S.values: trả về danh sách phần tử của dữ liệu kiểu theo kiểu ndarray
S.head(n): trả về n phần tử đầu tiên của S (trả về n hàng đầu tiên)
S.tail(n): trả về n phần tử cuối cùng của S (trả về n hàng cuối cùng)

19

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Minh họa Các hàm cơ bản trong pandas series (S)

20

10
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

apply() một hàm khác trên series

Series.apply(func, convert_dtype=True, args=(), **kwds)


Trong đó "func" là một đối số quan trọng, nó là một hàm sẵn có trong python hoặc ta tự định
nghĩa để xử lý từng phần tử của pandas series.
Phương thức apply() sẽ trả về một Series hoặc DataFrame, tùy thuộc vào "func".
Ý nghĩa của các tham số:

21

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

# Sử dụng một hàm từ thư viện numpy

S.apply(np.cos)

S.apply(lambda x: x if x%10==0 else x**3)

22

11
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

apply() một hàm khác được định nghĩa trước trên series

import pandas as pd
import numpy as np

def Tang(x):
return x if x > 500 else x + 1000

chi_so = ["KTKT","KTKT","CNTT","TC"]
gia_tri = [310, 360, 580, 340]
S = pd.Series(gia_tri, index=chi_so)
# áp dụng Tang trên S (không thay đổi S)

print(S.apply(Tang))

23

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

4. Làm việc với khung dữ liệu (DataFrame)

Ý tưởng cơ bản của một dataframe dựa trên bảng tính.


Cấu trúc dữ liệu của một dataframe như dạng bảng và bảng tính. Nó chứa một
bộ các cột. Mỗi cột bao gồm một loại dữ liệu duy nhất, nhưng các cột khác
nhau có thể có các loại dữ liệu khác nhau.
DataFrame có một chỉ mục hàng và cột; giống như một dictionary với key là tên
cột còn giá trị tương ứng là dữ liệu kiểu Series và chúng có chung chỉ mục
hàng.

24

12
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Khởi tạo dataframe:

Cú pháp chung:
pandas.DataFrame(data, index, columns, dtype, copy)
Trong đó:
‘data’ sẽ nhận giá trị từ nhiều kiểu khác nhau như list, dictionary, ndarray, series,… và cả
các DataFrame khác
‘index’ là nhãn chỉ mục hàng của dataframe
‘columns’ là nhãn chỉ mục cột của dataframe
‘dtype’ là kiểu dữ liệu cho mỗi cột
‘copy’ nhận giá trị True/False để chỉ rõ dữ liệu có được copy sang vùng nhớ mới không,
mặc định là False
Chú ý: Có thể kiểm tra dtype của một cột với df.nameOfColumn.dtype

25

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Tạo dataframe rỗng

import pandas as pd
df = pd.DataFrame()
print(df)

26

13
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Tạo dataframe từ list

import pandas as pd
import numpy as np
names = ["Apple","Grape","Orange"]
df = pd.DataFrame(names)
print(df)

names_rank = [["Apple",1],["Grape",25],["Orange",300]]
df = pd.DataFrame(names_rank)
print(df)

27

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Tạo dataframe từ dictionary các list

import pandas as pd
import numpy as np
crimes_rates = {"Year":[2001,2002,2003,2004,2005],
"Product":["Apple","Grape","Orange","Water","Lemon"],
"Population":[175300,256333,154833,2467801,125331],
"Total":[5646000,2549000,62347000,1355000,1576000]}
crimes_dataframe = pd.DataFrame(crimes_rates)
print(crimes_dataframe)

28

14
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Tạo dataframe từ list các dictionary

data = [{"Apple":5000,"Grape":4500,"Orange":12000},
{"Apple":1,"Grape":25,"Orange":300}]
df = pd.DataFrame(data, index=["NumOfStidents","ranking"])
print(df)
print(df.Orange.dtype)

29

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Tạo dataframe từ dictionary series

data = {
"one": pd.Series([1,23,45], index = [1,2,3]),
"two": pd.Series([1000,2000,1450,3534], index = [1,2,3,4])
}
df = pd.DataFrame(data)
print(df)

30

15
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Đọc dữ liệu từ file .csv

Nội dung của file brics.csv:


Số liệu về các quốc gia thuộc khối BRICS
Sử dụng dấu phẩy để ngăn giữa các dữ liệu
Mỗi dữ liệu trên 1 dòng
Dòng đầu tiên là tên các cột

31

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Đọc dữ liệu từ file .csv (tt)

import pandas as pd
d = pd.read_csv("/content/drive/MyDrive/Colab Notebooks/brics.csv")
print(d)

32

16
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Đọc dữ liệu từ file .csv (tt)

import pandas as pd
# đọc dữ liệu và quy định cột 0 dùng làm chỉ số dòng
brics = pd.read_csv("/content/drive/MyDrive/Colab Notebooks/brics.csv", index_col = 0)
print(brics)

33

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Tạo dataframe từ một dataframe khác


Với tham số copy mặc định (copy = False)
Đọc lại dữ liệu từ file brics.csv, sử dụng index tự động Tạo dataframe copy và thêm 1 cột

shared_brics cùng chia sẻ bộ nhớ với brics


Sau khi thêm cột ‘Note’ vào DataFrame shared_ brics.
Index sẽ tuân theo DataFrame gốc

34

17
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Tạo dataframe từ một dataframe khác


Với tham số copy = True
Đọc lại dữ liệu từ file brics.csv, sử dụng index tự động Tạo dataframe copy và thêm 1 cột

shared_brics là độc lập với brics


Sau khi thêm cột ‘Note’ vào DataFrame shared_ brics.
Index sẽ tuân theo DataFrame gốc

35

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Truy cập theo từng cột

Sử dụng tên cột làm chỉ số hoặc dùng luôn tên cột
Việc truy cập này trả về tham chiếu đến dữ liệu, vì vậy có thể sử dụng phép gán
để cập nhật dữ liệu theo cột

36

18
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Thêm một cột bằng cách sử dụng một cột mới chưa có

brics["on_earth"] = [True, True, False, True, True]


print(brics)

37

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Thêm một cột bằng cách sử dụng một cột mới chưa có và thiết lập
công thức phù hợp

brics["dens"] = brics["population"]/brics["area"]*1000
print(brics)

38

19
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Truy cập vào từng ô trên dataframe


Truy cập dòng dùng loc
kết hợp chỉ mục dòng và cột
print(brics.loc["RU"]) print(brics.loc["RU","country"])
print(brics.loc["RU","dens"])
print(brics.loc["RU","capital"])

39

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Xóa dòng hoặc cột bằng drop

# tạo ra dataframe mới bằng cách xóa 2 cột


new_brics = brics.drop(["area","population"], axis = 1)
new_brics # hoặc viết print(new_brics)

40

20
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Xóa dòng hoặc cột bằng drop (tt)

# trường hợp muốn xóa trên brics, thêm tham số inplace=True


brics.drop(["area","population"], axis = 1, inplace = True)
print(brics)

41

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

5.(2) Các hàm cơ bản trong pandas dataframe

T : trả về chuyển vị của DataFrame. Các hàng và cột sẽ hoán đổi nhau
axes : trả về danh sách có trục hàng và trục cột duy nhất.
dtypes : kiểu dữ liệu của object
empty : trả về giá trị True nếu NDFrame hoàn toàn trống [không có mục]; nếu bất kỳ trục nào có
độ dài bằng 0.
ndim : trả về giá trị Số chiều của axes / array
shape : trả về giá trị đại diện cho kích thước của DataFrame.
size : trả về giá trị Số phần tử của NDFrame
values : Đại diện numpy của NDFrame
head() : trả về n dòng đầu
tail(): trả về n dòng cuối

46

21
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Minh họa Các hàm cơ bản trong pandas dataframe

Tạo một DataFrame mới cho các ví dụ minh họa tiếp theo
import pandas as pd
import numpy as np

#Create a Dictionary of series


d = {'Name':pd.Series(['Tom','James','Ricky','Vi
n','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,
4.6,3.8])}

#Create a DataFrame
df = pd.DataFrame(d)
print ("Our data series is:")
print(df)

47

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Minh họa Các hàm cơ bản trong pandas dataframe (tt)

48

22
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Minh họa Các hàm cơ bản trong pandas dataframe (tt)

49

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Minh họa Các hàm cơ bản trong pandas dataframe (tt)

50

23
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Minh họa Các hàm cơ bản trong pandas dataframe (tt)

51

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Minh họa Các hàm cơ bản trong pandas dataframe (tt)

52

24
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Minh họa Các hàm cơ bản trong pandas dataframe (tt)

Để xem một phần nhỏ của DataFrame, ta sử dụng phương thức head () và tail ().
head () trả về n hàng đầu tiên (quan sát các giá trị chỉ số). Số phần tử mặc định để hiển thị là 5.

53

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Minh họa Các hàm cơ bản trong pandas dataframe (tt)

tail() trả về n hàng cuối cùng (quan sát các giá trị chỉ số). Số phần tử mặc định hiển thị là 5 phần tử.

54

25
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

6. Thống kê dùng pandas

Phương pháp thống kê giúp hiểu và phân tích hành vi của dữ liệu
DataFrame − “index” (axis=0, default), “columns” (axis=1)

Các hàm thống kê cơ bản: nhận đối số trục, trục có thể


được chỉ định bằng tên hoặc số nguyên. (bảng)
Tổng hợp dữ liệu : Hàm description () tính toán một bản
tóm tắt thống kê liên quan đến các cột DataFrame.
Hàm này cung cấp các giá trị thống kế cơ bản cho dữ liệu.
Hàm loại trừ các cột ký tự (text) trong dữ liệu cần thống kê.
'include' là đối số được sử dụng để chuyển thông tin cần thiết
về những cột nào cần được thống kê. (theo mặc định là giá trị
'number’).
object
number
all

55

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Minh họa các hàm thống kê cơ bản

Tạo một DataFrame sử dụng cho các minh họa tiếp theo

import pandas as pd
import numpy as np

#Create a Dictionary of series


d = {'Name':pd.Series(['Tâm','Minh','Quyên','Vân','Sơn','Sương',
'Tùng','Lâm','Đang','Giang','Bình','Ánh']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,
3.78,2.98,4.80,4.10,3.65])
}

#Create a DataFrame
df = pd.DataFrame(d)
print(df)

56

26
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Minh họa các hàm thống kê cơ bản (tt)

Với axis mặc định Với axis = 1

57

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Minh họa các hàm thống kê cơ bản (tt)

58

27
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Minh họa Hàm description ()

Include mặc định (‘number’)

59

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Các hàm thống kê nâng cao

Percent_change: hàm pct_change()


Series, DatFrames và Panel, tất cả đều có
hàm này.
Hàm này so sánh mọi phần tử với phần tử
trước của nó và tính toán tỷ lệ phần trăm
thay đổi.

60

28
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Các hàm thống kê nâng cao (tt)

Covariance (hiệp phương sai): hàm cov()


Hiệp phương sai được áp dụng trên dữ liệu series.
Đối tượng Series có một phương thức cov để tính
hiệp phương sai giữa các đối tượng series. NaN sẽ
tự động bị loại trừ.
import pandas as pd
import numpy as np
s1 = pd.Series(np.random.randn(10))
s2 = pd.Series(np.random.randn(10))
print('DataFrame s1')
print(s1)
print('DataFrame s2')
print(s2)
print('Hiệp phương sai')
print(s1.cov(s2))

61

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Các hàm thống kê nâng cao (tt)

Covariance (hiệp phương sai): hàm cov()


Phương pháp hiệp phương sai khi được áp dụng
trên DataFrame, tính toán cov giữa tất cả các cột.

import pandas as pd
import numpy as np
frame = pd.DataFrame(np.random.randn(10, 5),
columns=['a', 'b', 'c', 'd', 'e'])
print(frame['a'].cov(frame['b']))
print(frame.cov())

Lưu ý - giữa cột a và b trong câu lệnh đầu tiên cùng là


giá trị được trả về bởi cov trên DataFrame.

62

29
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Các hàm thống kê nâng cao (tt)

Correlation: hàm corr()


Correlation cho thấy mối quan hệ tuyến tính import pandas as pd
giữa hai mảng giá trị (series) bất kỳ. import numpy as np
frame = pd.DataFrame(np.random.randn(10, 5),
Có nhiều phương pháp để tính toán mối
columns=['a', 'b', 'c', 'd', 'e'])
tương quan như pearson (mặc định), print(frame['a'].corr(frame['b']))
Speman và kendall. frame_corr = frame.corr()
Nếu có bất kỳ cột nào không phải là số print(frame_corr)
trong DataFrame, nó sẽ tự động bị loại trừ.

63

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Các hàm thống kê nâng cao (tt)

Data Ranking: hàm rank()


Data ranking tạo ra xếp hạng cho từng phần tử trong mảng các phần tử. Trong trường hợp quan hệ, chỉ định thứ
hạng trung bình.
Rank tùy chọn nhận một tham số tăng dần (mặc định là True); khi False, dữ liệu được xếp hạng ngược, với các giá
trị lớn hơn được chỉ định một thứ hạng nhỏ hơn.
• average − xếp hạng trung bình của nhóm bị ràng buộc
• min − thứ hạng thấp nhất trong nhóm
• max − thứ hạng cao nhất trong nhóm
• first − xếp hạng được chỉ định theo thứ tự xuất hiện trong mảng

64

30
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Các hàm thống kê nâng cao (tt)

Data Ranking: hàm rank()


import pandas as pd
import numpy as np
d = {'Name':pd.Series(['Tâm','Minh','Quyên','Vân','Sơn','Sương', frame.rank()
'Tùng','Lâm','Đang','Giang','Bình','Ánh']), frame.rank(True)
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,
3.78,2.98,4.80,4.10,3.65])
}
frame = pd.DataFrame(d)
print(frame)
print(frame.rank())

frame.rank(False)

65

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

7. Chỉ mục (index)

Series và DataFrame đều chứa một thuộc tính là index trong đó nó không phải
trả về một mảng bình thường mà là một kiểu dữ liệu riêng biệt.
Index trong pandas là một thuộc tính khá quan trọng.
Index object có thể là immutable array (mảng bất biến) hoặc là ordered set (tập
hợp sắp thứ tự).

66

31
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Index là immutable array

Index về cơ bản khá giống với một mảng bình thường, chỉ trừ một điều duy nhất là nó có tính bất biến
"immutable" (không thay đổi được giá trị)
Mục đích của việc để tính bất biến cho mảng Index chính là nhằm đảm bảo an toàn
Ví dụ:

67

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Index là ordered set

Index object tuân theo nhiều quy ước giống như sets trong Python (tuân theo lý thuyết tập hợp),
Các phép toán như hợp, giao, hiệu và các phép toán khác có thể được dùng như sau:

indexA = pd.Index([1, 2, 3, 5, 7, 9])


indexB = pd.Index([1, 3, 8, 9, 10, 11])

print("Index A: ", indexA)


print("Index B: ", indexB)

print("Giao: ", indexA & indexB)

print("Hiệu: ", indexA - indexB)

print("Hợp: ", indexA | indexB)

print("Hiệu số đối xứng: ", indexA ^ indexB)

print("A <= B and A != B: ", indexA < indexB)

68

32
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Đánh chỉ mục

Các cách lập chỉ mục khác nhau


• Lập chỉ mục tiêu chuẩn / Standard indexing[ ]
• iloc
• loc

69

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Lập chỉ mục tiêu chuẩn

Lập chỉ mục tiêu chuẩn có thể được thực hiện bằng ký hiệu [ ]
Chọn một cột duy nhất Chọn nhiều cột (phải đưa ra một danh sách tên các cột)

70

33
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Lập chỉ mục tiêu chuẩn (tt)

Chọn một hoặc một số hàng (chỉ mục cuối / hàng kết thúc không được đọc)

71

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Lập chỉ mục tiêu chuẩn (tt)

Chọn các hàng cách nhau theo bước nhảy (chỉ mục hàng kết thúc không được đọc)

72

34
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Lập chỉ mục tiêu chuẩn (tt)

Chọn nhiều hàng và một cột Chọn nhiều hàng và nhiều cột

73

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Lập chỉ mục tiêu chuẩn (tt)

Chọn hàng bằng cách sử dụng một phần giá trị row_index (bao gồm chỉ mục cuối)

74

35
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Lập chỉ mục tiêu chuẩn (tt)

Chọn nhiều hàng và cột đơn bằng cách sử dụng giá trị row_index (bao gồm chỉ mục cuối)

75

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Lập chỉ mục tiêu chuẩn (tt)

Ghi chú:
Có thể chọn cột bằng cách chỉ định tên_cột.
Có thể chọn các hàng bằng cách đề cập đến phần giá trị row_index / vị trí row_index.
Trong khi chọn hàng:
nếu sử dụng một phần của vị trí row_index, thì chỉ mục cuối được loại trừ.
nếu sử dụng một phần của giá trị row_index / nhãn, thì bao gồm chỉ mục cuối.

Nếu chọn một cột đơn hoặc nhiều hàng với một cột duy nhất, nó sẽ trả về một chuỗi.
Chọn nhiều hàng và nhiều cột sẽ làm tăng KeyError
Phải chọn các hàng bằng cách chỉ đề cập đến lát cắt. Nếu chúng ta đề cập đến row_index hoặc danh sách
row_index, nó sẽ làm tăng KeyError

76

36
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

iloc ()

.iloc chủ yếu dựa trên vị trí số nguyên (từ 0 đến length-1 trục), nhưng cũng có thể được sử dụng với
một mảng boolean.
.iloc sẽ tăng lên IndexError nếu trình lập chỉ mục được yêu cầu nằm ngoài giới hạn, ngoại trừ trình chỉ
mục lát cho phép lập chỉ mục nằm ngoài giới hạn
Tham số đầu vào được phép là:
Một số nguyên.
Một danh sách hoặc một mảng các số nguyên
Một đối tượng lát cắt có ints
Một mảng boolean (bất kỳ NA giá trị nào sẽ được coi là False).
Một callable hàm có một đối số (gọi Series hoặc DataFrame) và trả về kết quả đầu ra hợp lệ để lập chỉ mục (một
trong các đối số ở trên).
Cú pháp:
df.iloc[row_index_position,col_index_position]

77

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

iloc ()

Nếu chỉ chọn một hàng, hàm sẽ trả về một chuỗi.

Nếu chọn nhiều hàng, phải chỉ định danh sách row_index, hàm sẽ trả về một dataframe.

78

37
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

iloc ()

Cả hàng và cột chỉ được đề cập dưới dạng vị trí chỉ mục.
Chọn nhiều hàng và nhiều cột Chọn nhiều hàng và cột đơn

Chọn một hàng và nhiều cột

79

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

iloc ()

Chọn hàng bằng cách sử dụng đối tượng lát cắt

df.iloc[::-1] Nếu chỉ mục bắt đầu và dừng không được đề df.iloc[6:1:-1]
cập, theo mặc định, nó sẽ bắt đầu từ hàng 0 và
kết thúc ở hàng cuối cùng.
Bước -1 có nghĩa là theo hướng ngược lại.

80

38
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

iloc ()

Chọn hàng và cột bằng đối tượng lát cắt


df1.iloc[0:4:2,0:2]
0:4:2 Vị trí Row_index. bắt đầu ở hàng 0,
dừng ở hàng 4 và tăng lên 2 (bước = 2)
0:2 Vị trí cột_index. bắt đầu ở cột 0, kết
thúc ở cột 2.

81

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

iloc ()

IndexError: Nếu chỉ định nhãn chỉ mục cột trong iloc, nó sẽ làm tăng IndexError

Ghi chú:
Bằng cách sử dụng iloc, không thể chọn một cột đơn lẻ hoặc nhiều cột một mình.
Chỉ đề cập đến vị trí row_index và column_index.
Nếu đề cập đến giá trị row_index hoặc giá trị column_index , nó sẽ làm tăng IndexError .
Khi sử dụng đối tượng lát cắt trong iloc, chỉ số dừng là exclusive

Nếu chọn một hàng, hàm sẽ trả về một chuỗi.

82

39
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

loc ()

loc chủ yếu dựa trên nhãn, nhưng cũng có thể được sử dụng với một mảng boolean.
loc sẽ tăng KeyErrorkhi các mục không được tìm thấy.
Đầu vào được phép là:
Nhãn đơn ‘a’
Danh sách các nhãn [‘a’,’b’,’c’]
Một đối tượng lát cắt có nhãn [‘a’:’c’]. Cả chỉ mục bắt đầu và dừng đều
Một mảng boolean (bất kỳ NA giá trị nào sẽ được coi là False).
Một callable hàm có một đối số (gọi Series hoặc DataFrame) và trả về kết quả đầu ra hợp lệ để lập chỉ mục (một
trong các đối số ở trên).
Cú pháp:
df.loc[row_index_label,col_index_label]

83

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

loc ()

Chọn hàng đơn, hàm sẽ trả về một chuỗi. Chọn nhiều hàng, hàm sẽ trả về dataframe.

84

40
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

loc ()

Chọn hàng đơn và cột đơn Chọn hàng đơn và nhiều cột

 Nếu đề cập đến hàng và cột dưới dạng danh sách có nghĩa, hàm sẽ trả
về khung dữ liệu
 Nếu đề cập đến hàng như một nhãn đơn và cột là danh sách, hàm sẽ trả
về một chuỗi.

85

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

loc ()

Chọn hàng bằng đối tượng lát cắt

Bắt đầu ở hàng 0 và dừng ở hàng 4, tăng dần lên 2.


Nếu sử dụng nhãn chỉ mục trong đối tượng lát cắt,
chỉ mục cuối là inclusive
Nếu sử dụng loc, hàm hoàn toàn lập chỉ mục dựa
trên nhãn.
Số nguyên là nhãn hợp lệ, nhưng chúng tham chiếu
đến nhãn, không phải vị trí.

86

41
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

loc ()

Chọn hàng và cột bằng cách sử dụng đối tượng lát cắt

::2  Tăng từng bước 2 từ hàng


đầu tiên đến hàng cuối cùng.
”Age”:”Rating”  Nó bao
gồm các cột từ “Age”đến“Rating”

87

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

loc ()

Ghi chú
Bằng cách sử dụng loc, không thể chọn một cột đơn lẻ hoặc nhiều cột một mình.
Chỉ đề cập đến nhãn row_index và column_index.
Nếu đề cập đến vị trí row_index hoặc column_index, hàm sẽ làm tăng KeyError .
Nếu chọn một hàng, hàm sẽ trả về một chuỗi.
Nếu cung cấp một đối tượng lát cắt là row_index / column_index, hàm sẽ không được viết trong list [ ]

88

42
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Ghi chú chung về đánh chỉ mục

Sử dụng standard indexing [ ], có thể chọn một cột duy nhất hoặc nhiều cột. Nhưng sử dụng loc
và iloc, không thể chọn một cột đơn lẻ hoặc nhiều cột một mình.
Sử dụng standard indexing [ ], có thể chọn các hàng bằng cách chỉ sử dụng một đối tượng lát cắt,
có thể đề cập đến các giá trị / vị trí row_index trong các đối tượng lát cắt. Nếu sử dụng giá trị row_index,
end_index sẽ được bao gồm (inclusive).
Sử dụng loc, hàm hoàn toàn lập chỉ mục dựa trên nhãn. Khi cắt được sử dụng trong loc, begin_index và
end_index đều được bao gồm (inclusive).
Sử dụng iloc, hàm hoàn toàn lập chỉ mục dựa trên số nguyên. Đây là 0-based lập chỉ mục. Khi việc cắt
lát được sử dụng trong iloc, begin_index được bao gồm (inclusive) , end_index bị loại trừ (exclusive).

89

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

8. THAO TÁC DỮ LIỆU

90

43
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Đọc dữ liệu

Pandas cung cấp một số công cụ giúp đọc một số định dạng dữ liệu phổ biến
và trả về một dataframe.
Đọc định dạng *csv ta dùng pd.read_csv()
Đọc định dạng excel ta dùng pd.read_excel()
Đọc định dạng html ta dùng pd.read_html()
Đọc định dạng json ta sử dụng pd.read_json()

91

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Đọc dữ liệu

Hàm pd.read_csv() có rất nhiều đối số giúp chúng ta tùy biến đọc dữ liệu
filepath_or_buffer: đường dẫn của file, đường dẫn này cũng chấp nhận cả dạng URL.
sep: chỉ định các giá trị trong file được phân biệt qua kí tự nào VD như: ‘,’ hoặc ‘space’, ‘t’. (mặc định là ‘,’)
header: chỉ rõ dataframe sẽ nhận hàng nào làm tên của cột, dữ liệu sẽ bắt đầu được tải lên từ sau dòng đấy.
index_col: chọn một cột làm index.
parse_dates: Nhận giá trị True/False. Nếu là True sẽ cố gắng chuyển index theo định nghĩa của tham số
date_parser về dạng datatime.
List: ví dụ [1,2,3] sẽ cố gắng chuyển cột 1,2,3 theo định nghĩa của tham số date_parser về dạng datatime.
List của list: ví dụ [[1,2,3]] chúng sẽ kết hợp cột 1,2,3 để có thể chuyển thành cột duy nhất có dạng datatime theo định
nghĩa date_parser.
chunksize: khi bộ nhớ máy tính không đủ để load một lần thì tham số chunksize sẽ là giải pháp đọc từng phần

92

44
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Minh họa đọc dữ liệu

Đọc dữ liệu từ file csv


import pandas as pd
df = pd.read_csv("/content/drive/MyDrive/Colab Notebooks/sales_14.csv",header=0,
index_col='Date', parse_dates=True)
df.head()

93

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Kĩ thuật reindexing

Khi chia sẻ thông tin giữa các dataframes sử dụng indexes.


Khi cần ghép nối dữ liệu giữa các dataframes với nhau sử dụng reindexing.
Ví dụ: có 2 dataframes:
quarterly_sales_2016 có index được sắp xếp theo thứ tự bảng chữ cái
quarterly_sales_2017 có index theo đúng thứ tự thời gian

quarterly_sales_2016 = pd.DataFrame({'turnover':[120000,
130000,140000,150000]},index=['Apr','Jan','Jul','Oct'])
print("quarterly_sales_2016:",quarterly_sales_2016)

quarterly_sales_2017 = pd.DataFrame({'turnover':[110000,
150000,130000,120000]},index=['Jan','Apr','Jul','Oct'])
print("quarterly_sales_2017:",quarterly_sales_2017)

94

45
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Minh họa Kĩ thuật reindexing

Bài toán 1: cần dataframe có index theo thứ tự thời gian


Cần định nghĩa một list theo thứ tự thời gian và sử dụng .reindex() để tạo ra một dataframe mới từ
quarterly_sales_2016 có index theo thứ tự thời gian như quarterly_sales_2017.

ordered = ['Jan','Apr','Jul','Oct']
quarterly_sales_2016.reindex(ordered)

95

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Minh họa Kĩ thuật reindexing

Bài toán 2: cần dataframe có index tuân theo thứ tự bảng chữ cái.
Hàm sort_index() trả về dataframe từ quarterly_sales_2017 có index theo thứ tự bảng chữ cái.

quarterly_sales_2017.sort_index()

96

46
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Minh họa Kĩ thuật reindexing

Bài toán 3: Reindexing dataframe A giống với dataframe B.


Tương tự bài toán 1, sử dụng index của quarterly_sales_2017 làm index cho quarterly_sales_2016.
(không cần định nghĩa thủ công một list)

quarterly_sales_2016.reindex(quarterly_sales_2017.index)

97

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Iteration (Duyệt phần tử)

Duyệt một DataFrame bởi các tên cột


import pandas as pd
import numpy as np
# tạo dataframe
N=20
df = pd.DataFrame({
'A': pd.date_range(start='2016-01-01',periods=N,freq='D'),
'x': np.linspace(0,stop=N-1,num=N),
'y': np.random.rand(N),
'C': np.random.choice(['Low','Medium','High'],N).tolist(),
'D': np.random.normal(100, 10, size=(N)).tolist()
})

print(df)

# Duyệt một DataFrame bởi các tên cột


for col in df:
print (col)

98

47
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Iteration (Duyệt phần tử) (tt)

Để lặp lại các hàng của DataFrame, chúng ta có thể sử dụng các hàm sau:
iteritems() − để lặp qua các cặp (khóa, giá trị)
iterrows() − lặp qua các hàng dưới dạng cặp (index,series)
itertuples() − lặp qua các hàng dưới dạng các tệp đã đặt tên

99

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

iteritems()

Duyệt từng cột dưới dạng khóa, cặp giá trị với nhãn là khóa và giá trị cột dưới dạng đối tượng Dòng

hiển thị dataframe theo dạng bảng.

mỗi cột được lặp lại riêng biệt dưới dạng một cặp khóa-giá trị trong series.

100

48
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

iterrows()

Trả về từng giá trị index cùng với một series chứa dữ liệu trong mỗi hàng

hiển thị dataframe theo dạng bảng.

Lưu ý: Vì iterrows () lặp qua các hàng nên không bảo toàn kiểu dữ
liệu trên hàng. 0,1,2 là các chỉ số hàng và col1, col2, col3 là các chỉ số cột.

101

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

itertuples()

Trả về một một bộ giá trị được đặt tên cho


mỗi hàng trong DataFrame.
Phần tử đầu tiên là giá trị index tương ứng
của hàng, các giá trị còn lại là giá trị hàng.
hiển thị dataframe theo dạng bảng.

Lưu ý: Không nên sửa đổi bất kỳ đối tượng nào trong khi duyệt. Duyệt có nghĩa là đọc và trình lặp trả về một
bản sao của đối tượng ban đầu, do đó các thay đổi sẽ không phản ánh trên đối tượng ban đầu.

102

49
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Sắp xếp (Sort)

Có hai cách sort có sẵn trong Pandas:


Theo nhãn
Theo giá trị
Ví dụ: sử dụng dataframe sau để minh họa

import pandas as pd
import numpy as np

unsorted_df=pd.DataFrame(np.random.randn(10,2),
index=[1,4,6,2,3,5,9,8,0,7],
columns=['col2','col1'])
print (unsorted_df)

103

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Sắp xếp theo nhãn (Label)

Sử dụng phương thức sort_index (): bằng cách chuyển các đối số trục và thứ tự sắp xếp, DataFrame
có thể được sắp xếp.
Theo mặc định, việc sắp xếp được thực hiện trên các nhãn hàng theo thứ tự tăng dần. Có thể thêm tham
số (giá trị Boolean) để giảm dần (False).

Sắp xếp giảm dần


Sắp xếp tăng dần

104

50
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Sắp xếp theo cột

Bằng cách chuyển đối số trục với giá trị 0 hoặc 1, việc sắp xếp có thể được thực hiện trên các nhãn cột.
Theo mặc định, axis = 0, sắp xếp theo hàng

Sắp xếp theo hàng Sắp xếp theo cột

105

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Sắp xếp theo giá trị (Value)

Tương tự như sắp xếp theo chỉ mục, sort_values()là phương thức để sắp xếp theo giá trị.
Phương thức dùng đối số 'by' sẽ sử dụng tên cột (01 hoặc nhiều cột) của DataFrame để chỉ định các
giá trị của cột nào sẽ được sắp xếp.

106

51
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Thuật toán sắp xếp

sort_values () cung cấp thuật toán như mergesort, heapsort và quicksort. Trong đó Mergesort là thuật toán
ổn định nhất.

107

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

9. Xử lý dữ liệu khuyết

Thiếu dữ liệu luôn là vấn đề trong các tình huống thực tế.
Các lĩnh vực như học máy và khai thác dữ liệu phải đối mặt với các vấn đề nghiêm trọng về độ chính xác
của các mô hình dự đoán do chất lượng dữ liệu kém, hoặc do các giá trị bị thiếu.
Việc xử lý giá trị còn thiếu là trọng tâm chính để làm cho mô hình chính xác và mang tính hợp lý hơn.
Quá trình xử lý dữ liệu khuyết:
Kiểm tra các giá trị bị thiếu
Làm sạch / lấp đầy dữ liệu bị thiếu
Thay thế NaN bằng Giá trị vô hướng
Điền NA Forward và Backward
Bỏ các giá trị bị thiếu
Thay thế các giá trị chung Hoặc giá trị bị thiếu

108

52
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Ví dụ minh họa

Tạo một DataFrame có giá trị NaN bằng kỹ thuật dể sử dụng cho các minh họa tiếp theo

# import the pandas library


import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3),
index=['a', 'c', 'e', 'f', 'h'],
columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])

print(df)
NaN có nghĩa là Không phải số

109

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Kiểm tra các giá trị bị thiếu

Hàm isnull()
Hàm notnull()

Các phép tính thiếu dữ liệu


• Khi tổng hợp dữ liệu, NA sẽ được coi là Zero
• Nếu dữ liệu đều là NA thì kết quả sẽ là NA

110

53
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Làm sạch / lấp đầy dữ liệu bị thiếu

Hàm fillna có thể “điền vào” các giá trị NA với dữ liệu không phải null theo một số cách

Thay thế NaN bằng Giá trị vô hướng


Ví dụ: Thay "NaN" bằng "0"

print(df)
print("NaN replaced with '0':")
print(df.fillna(0))

111

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Làm sạch / lấp đầy dữ liệu bị thiếu (tt)

Điền NA Forward và Backward


pad/fill : Fill methods Forward bfill/backfill : Fill methods Backward

112

54
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Bỏ các giá trị bị thiếu (Drop)

Hàm dropna(đối số trục): chỉ loại bỏ các giá trị bị thiếu.


Theo mặc định, axis = 0 (dọc theo hàng) : bất kỳ giá trị nào
trong một hàng là NA thì toàn bộ hàng sẽ bị loại trừ. axis = 1

113

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Thay thế các giá trị chung Hoặc giá trị bị thiếu

Hàm replace(giá trị hiện tại:giá trị thay thế): thay thế một giá trị chung bằng một giá trị
cụ thể nào đó.
Hàm fillna () : Thay thế NA bằng một giá trị vô hướng

from numpy.core.numeric import NaN


print(df)
print("Kết quả sau khi thay thể giá trị NaN bằng 10")
print(df.replace({NaN:10}))

114

55
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

10. Trộn và Gộp dữ liệu (Joining/Merging)

Pandas cung cấp một hàm duy nhất cho tất cả các kiểu joining/merging.
Cú pháp như sau:
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False)

115

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Ý nghĩa các đối số trong hàm pd.merge


left một đối tượng dataframe
right đối tượng dataframe khác
tên các cột sẽ làm key để join với điều kiện các cột phải nằm trong cả hai DataFrame. Mặc định nó sẽ tự nhận các cột có cùng
on
tên làm keys để join.

left_on Dùng các cột từ left dataframe để làm key cho việc join. Có thể là tên cột hoặc mảng có chiều dài bằng độ dài của dataframe

right_on Dùng các cột từ right dataframe để làm key cho việc join. Có thể là tên cột hoặc mảng có chiều dài bằng độ dài của dataframe.

Nếu là True, sử dụng index (row labels) left từ dataframe như là key để join. Trong trương hợp MultiIndex dataframe, key join
left_index
xem xét cả level của index.
Nếu là True, sử dụng index (row labels) right từ dataframe như là key để join. Trong trương hợp MultiIndex dataframe, key join
right_index
xem xét cả level của index.
how kiểu join 'left', 'right', 'outer', 'inner'. Mặc định là inner.
sort dataframe trả về có được sort theo key hay không.
suffixes Một tuple của các hậu tố của string sử dụng cho các cột trùng lặp. Mặc định là (_x, _y).
copy Mặc định là True, dữ liệu được xử lý trên đối tượng dataframe mới hay không

Thêm cột vào dataframe đầu ra được gọi là _merge với thông tin về nguồn của mỗi hàng. _merge là phần phân loại và lấy giá
indicator trị left_only cho các quan sát có khoá hợp nhất chỉ xuất hiện trong left dataframe, right_only cho các quan sát có key hợp nhất
chỉ xuất hiện trong right dataframe và cả hai nếu key hợp nhất quan sát được tìm thấy trong cả hai

116

56
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Giải thích đối số ‘how’

“how” Ý nghĩa

Left LEFT OUTER JOIN Sử dụng các keys từ bảng bên trái

Right RIGHT OUTER JOIN Sử dụng các keys từ bảng bên phải

Outer FULL OUTER JOIN Sử dụng các keys từ cả hai bảng

Inner INNER JOIN Sử dụng các keys chung giữa hai bảng

117

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Ví dụ minh họa

Tạo 2 DataFrame như sau


import pandas as pd
import numpy as np
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})

118

57
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Ví dụ minh họa (tt)

Thực hiện phép join 2 dataframe với đối số mặc định how = inner

pd.merge(left, right, on=['key1', 'key2'])

119

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Ví dụ minh họa (tt)

Thực hiện phép join với “how” = ‘left’.

pd.merge(left, right, how='left', on=['key1', 'key2'])

120

58
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Ví dụ minh họa (tt)

Thực hiện phép join với “how” = ‘outer’.

pd.merge(left, right, on=['key1','key2'], how='outer')

121

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Giải thích đối số ‘suffixes’

Trường hợp hai bảng có tên cột giống nhau khi joining (không phải tên key
giống nhau). Từ khóa suffixes sẽ giúp phân biệt cột giống nhau đến từ
dataframe nào bằng cách cho thêm hậu tố vào tên cột.
pd.merge(left, right, on=[left.A,right.D], how='outer',suffixes=('_left','_right'))

122

59
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Giải thích đối số ‘indicator’

Indicator giúp chỉ rõ hàng đó đến từ dataframe nào.


pd.merge(left, right, on=['key1','key2'], how='outer',indicator =True)

123

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Joining on index

.join() là một phương pháp thuận tiện để kết hợp các cột của hai dataframe được lập chỉ mục khác
nhau có khả năng phân loại khác nhau vào một dataframe đơn.
Ví dụ minh họa:
Tạo 2 dataframe như sau

left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],


'B': ['B0', 'B1', 'B2']},
index=['K0', 'K1', 'K2'])
right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],
'D': ['D0', 'D2', 'D3']},
index=['K0', 'K2', 'K3'])

124

60
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Ví dụ minh họa

Hai lệnh sau là tương đương

left.join(right) pd.merge(left, right, left_index=True,


right_index=True, how='left')

!! Sinh viên tự thực hành thử với các loại join khác qua từ khóa how = ‘right’ , ‘outer’

125

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Joining key columns on an index

.join() cũng cung cấp một đối số tùy chọn là ‘on’ để truyền vào.
Đối số ‘on’ có thể là tên cột hoặc nhiều tên cột, xác định rằng chỉ mục của
right dataframe truyền vào sẽ được liên kết dựa trên (các) cột trong left
dataframe.
Cú pháp dùng .join() và pd.merge() sau đây là tương đương:
left.join(right, on=key_or_keys)
pd.merge(left, right, left_on=key_or_keys, right_index=True,how='left', sort=False)

126

61
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Ví dụ minh họa

left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],


'B': ['B0', 'B1', 'B2', 'B3'],
'key': ['K0', 'K1', 'K0', 'K1']})
right = pd.DataFrame({'C': ['C0', 'C1'],'D': ['D0', 'D1']},
index=['K0', 'K1'])

left.join(right, on='key')

127

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Ví dụ minh họa (tt)

Trường hợp multikey, được truyền đến dataframe có MultiIndex


left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1']})
index = pd.MultiIndex.from_tuples([('K0', 'K0'),
('K1', 'K0'),
('K2', 'K0'),
('K2', 'K1')])
right = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=index)
result = left.join(right, on=['key1', 'key2'])

128

62
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Joining with two multi-indexes

.join() không sử dụng được với mục đích này, nhưng chúng ta có thể thực hiện với pd.merge()
Ví dụ minh họa:
index_right = pd.MultiIndex.from_tuples([('K0', 'Y0'),
('K1', 'Y1'),
('K2', 'Y2'),
('K2', 'Y3')],
names=['key', 'Y'])
right = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index= index_right)
index_left = pd.MultiIndex.from_tuples([('K0', 'X0'),
('K0', 'X1'),
('K1', 'X2')],
names=['key', 'X'])
left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2']},
index=index_left)
pd.merge(left.reset_index(), right.reset_index(),
on=['key'], how='inner').set_index(['key','X','Y'])

129

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Thay vì truyền vào left, right ta truyền vào left reset_index() và right.reset_index() tương tứng.

Chuyển về phéo join cơ bản trên key.


result = pd.merge(left.reset_index(),
right.reset_index(),on=['key'], how='inner')
result

130

63
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Chuyển ba cột “key”,’X’,’Y’ làm index qua phương thức đã học set_index()
result = pd.merge(left.reset_index(), right.reset_index(),
on=['key'], how='inner').set_index(["key",'X','Y'])
result

131

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

11a. Làm sạch dữ liệu

Để hiểu được những khía cạnh nào của tập dữ liệu cần được làm sạch, trước tiên chúng ta cần xem
những dữ liệu đang xử lý.
Import dữ liệu từ file csv vào python
import pandas as pd
df = pd.read_csv("/content/drive/MyDrive/Colab Notebooks/sales_14.csv")
df

Sử dụng các chức năng tích hợp của Pandas .info() và .describe()

132

64
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Minh họa một số thao tác có thể phối hợp làm sạch dữ liệu

Kiểm tra tổng số phần tử rỗng trong mỗi cột df.isnull().sum()


Tính phần trăm của các phần tử rỗng trong toàn bộ tập dữ liệu
rows, columns = df.shape
cell_count = rows * columns
number_of_nulls = df.isnull().sum().sum()
percentage_of_missing = (number_of_nulls / cell_count) * 100
print(f'Percentage of missing values: {percentage_of_missing}%')

Thực hiện các thao tác xử lý dữ liệu khuyến với .dropna() , .fillna()

Để tạo ra phân tích chất lượng cao, cần đảm bảo làm sạch dữ liệu để thể hiện chính
xác tập dữ liệu. Pandas cung cấp một loạt các chức năng tích hợp có thể được sử dụng
để làm sạch và thao tác các tập dữ liệu trước khi phân tích, cho phép loại bỏ các hàng
và cột không hoàn chỉnh, lấp đầy các giá trị bị thiếu.

133

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Các đoạn code giúp xử lý và làm sạch dữ liệu

Đổi tên các cột trong DataFrame theo thứ tự


df.columns = ['a','b','c']
Kiểm tra dữ liệu với giá trị null
pd.isnull()
Kiểm tra dữ liệu với giá trị khác null
pd.notnull()
Cách bỏ toàn bộ dòng có dữ liệu null
df.dropna()
Cách bỏ toàn bộ cột có dữ liệu null
df.dropna(axis=1)

134

65
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Các đoạn code giúp xử lý và làm sạch dữ liệu

Cách bỏ các dòng có nhiều hơn n giá trị null


df.dropna(axis=1, thresh=n)
Cách thay toàn bộ giá trị null bằng giá trị x
df.fillna(x)
Cách thay toàn bộ giá trị null bằng giá trị khác
Thay giá trị null trong Series bởi giá trị mean của các giá trị trong Series (mean
có thể thay được bởi các hàm khác trong module statistics của Python)
s.fillna(s.mean())

135

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Các đoạn code giúp xử lý và làm sạch dữ liệu

Cách chuyển đổi kiểu dữ liệu của Series sang Float


s.astype(float)
Cách thay giá trị này bởi giá trị khác
Thay tất cả các giá trị bằng 1 bởi one
s.replace(1,'one')
Cách thay nhiều giá trị cùng lúc
s.replace([1,3],['one','three'])
Cách đổi tên cột hàng loạt bằng lambda
df.rename(columns=lambda x: x + 1)
Cách đổi tên cột cụ thể trong DataFrame
df.rename(columns={'old_name': 'new_ name'})
Cách đổi index trong DataFrame
df.set_index('column_one')
Cách đổi index hàng loạt trong DataFrame
df.rename(index=lambda x: x + 1)

136

66
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

11b. Chuyển đổi dữ liệu

Chuyển đổi dữ liệu từ loại này sang loại khác bằng cách sử dụng các phương pháp tích hợp sẵn của
Pandas astype() và to_numeric() để giải quyết các vấn đề phổ biến sau:
Chuyển chuỗi / int thành int / float
Chuyển đổi float thành int
Chuyển đổi một cột có nhiều kiểu dữ liệu hỗn hợp
Xử lý các giá trị bị thiếu
Chuyển đổi một cột tiền thành float
Chuyển đổi boolean thành 0/1
Chuyển đổi nhiều cột dữ liệu cùng một lúc
Xác định kiểu dữ liệu khi đọc tệp CSV
Tạo một hàm tùy chỉnh để chuyển đổi kiểu dữ liệu
astype () so với to_numeric ()

137

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Ví dụ minh họa

Tạo 1 DataFrame như sau sử dụng cho các minh họa


import pandas as pd
import numpy as np
df = pd.DataFrame({
'string_col': ['1','2','3','4'],
'int_col': [1,2,3,4],
'float_col': [1.1,1.2,1.3,4.7],
'mix_col': ['a', 2, 3, 4],
'missing_col': [1.0, 2, 3, np.nan],
'money_col': ['£1,000.00','£2,400.00','£2,400.00','£2,400.00'],
'boolean_col': [True, False, True, True],
'custom': ['Y', 'Y', 'N', 'N']
})

138

67
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Kiểm tra các loại dữ liệu bằng dtypes : xem tất cả các kiểu dữ liệu trong DataFrame

df.dtypes df.info()

139

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Chuyển chuỗi / int thành int / float

Chuyển đổi cột sang một loại dữ liệu khác sử dụng phương pháp Series : astype()
Ví dụ: chuyển đổi chuỗi thành số nguyên

df['string_col'] = df['string_col'].astype('int')

140

68
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Chuyển chuỗi / int thành int / float

Ví dụ: chuyển kiểu dữ liệu thành float


Theo mặc định, float đang sử dụng số dấu phẩy động 64-bit; có thể sử dụng 'float128’ để có độ chính xác cao
hơn hoặc 'float16’ hiệu quả bộ nhớ tốt hơn.
# string to float
df['string_col'] = df['string_col'].astype('float')
df.dtypes
# For more precision
df['string_col'] = df['string_col'].astype('float128')
# For more memory efficiency
df['string_col'] = df['string_col'].astype('float16')
df['string_col'] = df['string_col'].astype('float32')

141

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Chuyển đổi float thành int

Ví dụ: chuyển đổi một cột float thành số nguyên

df['float_col'] = df['float_col'].astype('int')

142

69
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Cách đơn giản nhất để chuyển đổi kiểu dữ liệu từ kiểu này sang kiểu khác là sử dụng phương thức
astype(). Phương pháp này được hỗ trợ bởi cả Pandas DataFrame và Series.
Nếu đã có một kiểu dữ liệu số ( int8, int16, int32, int64, float16, float32, float64, float128, và boolean) cũng
có thể sử dụng astype() để:
chuyển đổi nó sang một kiểu dữ liệu số khác (int thành float, float thành int, v.v.)
sử dụng nó để downcast xuống kích thước nhỏ hơn hoặc upcast lên kích thước byte lớn hơn
Hàm Pandas to_numeric()có thể xử lý các giá trị này một cách tốt hơn. Có thể đặt đối số
errors='coerce’ để ép buộc các giá trị không hợp lệ thành NaN:
pd.to_numeric(df['mixed_col'], errors='coerce’)
Có thể chuyển đổi cột dữ liệu Pandas sang kiểu số với astype()và to_numeric().
astype()là cách đơn giản nhất và cung cấp nhiều khả năng hơn trong cách chuyển đổi.
to_numeric()có nhiều chức năng mạnh mẽ hơn để xử lý lỗi.

143

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

12. Thu gom và nhóm dữ liệu (GroupBy)

Quá trình "groupby " liên quan đến một hoặc nhiều bước sau:
(1) Chia dữ liệu thành các nhóm dựa trên một số tiêu chí
(2) Áp dụng một số tính toán cho từng nhóm một cách độc lập
(3) Kết hợp các kết quả vào một cấu trúc dữ liệu
Trong bước (2), có thể thực hiện các thao tác sau:
Tổng hợp (Aggregation/Reduction): phân tích thống kê trong một nhóm. Ví dụ:
Tính sum, mean, std, min, max của nhóm dữ liệu
Tính toán số lượng nhóm (size/count)
Chuyển đổi (Transformation): thực hiện một số tính toán nhóm cụ thể và trả về một kiểu giống chỉ mục. Vài ví dụ:
Chuẩn hoá dữ liệu (zscore) trong nhóm
Fill các giá trị NAs bằng một giá trị từ các nhóm.
Lọc (Filtration): loại bỏ một số nhóm, tính toán theo nhóm nhằm đánh giá Đúng hay Sai. Vài ví dụ:
Loại bỏ dữ liệu thuộc nhóm chỉ với một vài thành viên
Lọc dữ liệu dựa trên sum hay mean của nhóm
Hoặc là kết hợp của các thao tác trên: GroupBy sẽ kiểm tra kết quả của các bước và trả lại một kết quả hợp lý.

144

70
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Groupby trong dataframe

Groupby là phép toán thực hiện trên DataFrames, khi thực thi sẽ thực hiện 3 việc:
Chia tập dữ liệu
Phân tích dữ liệu
Nhóm dữ liệu
Hàm groupby: chia nhỏ dữ liệu thành 1 hoặc nhiều nhóm
DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_ke
ys=True, squeeze=False, observed=False, **kwargs)
Tham số thường dùng:
• by : mapping, function, label, hoặc danh sách các label. Xác định nhóm để groupby.
• axis : int, 0: group theo hàng, 1: group theo cột (mặc định 0)
• level : int/string, chỉ số level hoặc tên cột, mặc định None. Sử dụng với MultiIndex, để chỉ rõ lấy index nào
• as_index : boolean, mặc định True. Giá trị True: kết quả trả về column được group sẽ là key.
• sort : boolean, mặc định True. Sắp xếp key, để tăng hiệu suất thì hãy để False.

145

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Các chức năng tổng hợp sau khi thực hiện thao tác groupby

mean(): Tính trung bình của các nhóm


sum(): Tính tổng các giá trị của nhóm
size(): Tính kích thước nhóm
count(): Tính toán số lượng nhóm
std(): Độ lệch chuẩn của các nhóm
var(): Tính toán phương sai của các nhóm
sem(): Sai số chuẩn của giá trị trung bình của các nhóm
describe(): Tạo thống kê mô tả
first(): Tính toán giá trị đầu tiên của nhóm
last(): Tính giá trị cuối cùng của nhóm
nth(): Lấy giá trị thứ n hoặc một tập hợp con nếu n là một danh sách
min(): Tính toán giá trị nhỏ nhất nhóm
max(): Tính toán giá trị lớn nhất nhóm

146

71
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Ví dụ minh họa

Tạo DataFrame như sau

import pandas as pd
import numpy as np
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar'],
'B' : ['one', 'one', 'two', 'three'],
'C' : np.random.randn(4),
'D' : np.random.randn(4)})

147

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Ví dụ minh họa (tt)

Thực hiện Groupby theo cột A, B grouped = df.groupby(['A', 'B'])


Thực hiện Groupby theo cột A grouped = df.groupby(['A'])

Thực hiện Groupby theo cột A và tính giá trị trung bình của các nhóm
grouped = df.groupby(['A'])
grouped.mean()

Thực hiện Groupby theo cột B và tính toán kích thước nhóm
grouped = df.groupby(['B'])
grouped.size()

* Sinh viên tự thực hiện các thao tác minh họa với những lệnh còn lại

148

72
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

13. XỬ LÝ VĂN BẢN TRONG PANDAS

149

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Các hàm chuỗi thao tác trên dữ liệu series

Đặc điểm chung là các hàm này bỏ qua (hoặc loại trừ) các giá trị bị thiếu / NaN.
• lower() : chuyển chuỗi String thành chữ thường
• upper() : chuyển chuỗi String thành chữ in hoa
• len() : Độ dài chuỗi
• strip() : Loại bỏ khoảng trắng
• split(' ‘) : Cắt chuỗi
• cat(sep=' ‘) : Nối chuỗi
• get_dummies() : Trả về DataFrame với các giá trị được mã hóa một lần.
• contains(pattern) : Trả về giá trị Boolean True cho mỗi phần tử nếu chuỗi con chứa trong phần tử, ngược lại False.
• replace(a,b) : Thay thế giá trị a và b
• repeat(value) : Lặp lại từng phần tử với số lần xác định.
• count(pattern) : Trả về số lần xuất hiện của pattern trong mỗi phần tử.
• startswith(pattern) : Trả về true nếu phần tử trong Chuỗi bắt đầu bằng pattern.
• endswith(pattern) : Trả về true nếu phần tử trong Chuỗi kết thúc bằng pattern.
• find(pattern) : Trả về vị trí đầu tiên của lần xuất hiện đầu tiên của pattern.
• findall(pattern) : Trả về danh sách tất cả các lần xuất hiện của pattern.
• swapcase : Hoán đổi chữ hoa / chữ thường.
• islower() : Kiểm tra xem tất cả các ký tự trong mỗi chuỗi có viết thường hay không. Trả về Boolean
• isupper() : Kiểm tra xem tất cả các ký tự trong mỗi chuỗi có viết hoa hay không. Trả về Boolean.
• isnumeric() : Kiểm tra xem tất cả các ký tự trong mỗi chuỗi có phải là số hay không. Trả về Boolean.

150

73
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Minh họa các hàm chuỗi thao tác trên dữ liệu series
import pandas as pd
import numpy as np

s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t', np.nan, '1234','SteveSmith'])

print(s)

# hàm lower()
print (s.str.lower())

# hàm upper()
print (s.str.upper())

# hàm len()
print (s.str.len())

# hàm strip()
print ("After Stripping:")
print (s.str.strip())

151

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Minh họa các hàm chuỗi thao tác trên dữ liệu series
# hàm split(pattern)
print ("Split Pattern:")
print (s.str.split(' '))

# hàm cat(sep=pattern)
print (s.str.cat(sep='_'))

# hàm get_dummies()
print (s.str.get_dummies())

# hàm contains(' ')


print (s.str.contains(' '))

# hàm replace(a,b)
print ("After replacing @ with $:")
print (s.str.replace('@','$'))

# hàm repeat(value)
print (s.str.repeat(2))

152

74
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Minh họa các hàm chuỗi thao tác trên dữ liệu series
# hàm count(pattern)
print ("The number of 'm's in each string:")
print (s.str.count('m'))

# hàm startswith(pattern)
print ("Strings that start with 'T':")
print (s.str. startswith ('T'))

# hàm endswith(pattern)
print ("Strings that end with 't':")
print (s.str.endswith('t'))

# hàm find(pattern)
# giá trị trả về là "-1" cho biết rằng phần tử không có pattern như vậy.
print (s.str.find('e'))

# hàm findall(pattern)
# giá trị trả về Danh sách rỗng ([]) có nghĩa không có sẵn pattern trong phần tử.
print (s.str.findall('e'))

153

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

Minh họa các hàm chuỗi thao tác trên dữ liệu series

# hàm swapcase()
print (s.str.swapcase())

# hàm islower()
print (s.str.islower())

# hàm isupper()
print (s.str.isupper())

# hàm isnumeric()
print (s.str.isnumeric())

154

75
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

14. OPTIONS VÀ CUSTOMIZE

155

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

API trong Pandas

Pandas cung cấp API để tùy chỉnh một số tính chất của nó, API gồm 5 hàm như sau :
get_option()
set_option()
reset_option()
describe_option()
option_context()

Tham số truyền vào hàm


display.max_rows : Hiển thị số hàng tối đa để hiển thị
display.max_columns : Hiển thị số cột tối đa để hiển thị
display.expand_frame_repr : Hiển thị DataFrames để kéo dài trang
display.max_colwidth : Hiển thị chiều rộng cột tối đa
display.precision : Hiển thị độ chính xác cho số thập phân

156

76
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

get_option(param)

get_option nhận một tham số duy nhất và trả về giá trị như đã cho trong đầu ra bên dưới
Kết quả hiển thị số giá trị dòng, cột mặc định.

import pandas as pd
print(pd.get_option("display.max_rows"))

import pandas as pd
print(pd.get_option("display.max_columns"))

157

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

set_option(param,value)

set_option nhận hai đối số và đặt giá trị cho tham số như sau :
display.max_rows : thay đổi số lượng hàng mặc định được hiển thị.
display.max_columns : thay đổi số lượng hàng mặc định được hiển thị.

import pandas as pd
pd.set_option("display.max_columns",30)
print(pd.get_option("display.max_columns"))

import pandas as pd
pd.set_option("display.max_rows",70)
print(pd.get_option("display.max_rows"))

158

77
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

reset_option(param)

reset_option nhận một đối số và đặt giá trị trở lại giá trị mặc định.
display.max_rows : thay đổi giá trị trở lại số hàng mặc định được hiển thị.
display.max_columns : thay đổi giá trị trở lại số cột mặc định được hiển thị.

import pandas as pd
pd.reset_option("display.max_rows")
print(pd.get_option("display.max_rows"))

import pandas as pd
pd.reset_option("display.max_columns")
print(pd.get_option("display.max_columns"))

159

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

describe_option(param)

description_option in ra mô tả của đối số.


display.max_rows
display.max_columns

import pandas as pd
pd.describe_option("display.max_rows")

import pandas as pd
pd.describe_option("display.max_columns")

160

78
3/7/2022

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

option_context()

option_context () giúp ta có thể đặt giá trị tạm thời.


import pandas as pd
print(pd.get_option("display.max_rows"))
with pd.option_context("display.max_rows",15):
print(pd.get_option("display.max_rows"))

Sự khác biệt giữa câu lệnh print đầu tiên và thứ hai:
- Câu lệnh đầu tiên in giá trị được đặt bởi option_context () là giá trị tạm thời.
- Sau ngữ cảnh with, câu lệnh print thứ hai in ra giá trị được cấu hình.

161

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

BÀI TẬP

170

79
3/7/2022

THANK YOU

ThS. Huỳnh Đỗ Bảo Châu – ThS. Nguyễn Hoàng Ân

176

80

You might also like