Professional Documents
Culture Documents
Microsoft PowerPoint - C1 Xu Ly Du Lieu Voi Pandas
Microsoft PowerPoint - C1 Xu Ly Du Lieu Voi Pandas
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ế)
1
3/7/2022
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,
2
3/7/2022
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.
“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
import pandas as pd
import numpy as np
# numpy thường được import kèm pandas
4
3/7/2022
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
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
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
12
6
3/7/2022
import pandas as pd
import numpy as np
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
import pandas as pd
import numpy as np
print(S)
print(S.index)
print(S.values)
14
7
3/7/2022
import pandas as pd
import numpy as np
print(S)
print(S.index)
print(S.values)
15
import pandas as pd
import numpy as np
print(S[‘KTKT’])
print(S[‘CNTT’])
print(S.TC)
16
8
3/7/2022
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
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
18
9
3/7/2022
19
20
10
3/7/2022
21
S.apply(np.cos)
22
11
3/7/2022
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
24
12
3/7/2022
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
import pandas as pd
df = pd.DataFrame()
print(df)
26
13
3/7/2022
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
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
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
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
31
import pandas as pd
d = pd.read_csv("/content/drive/MyDrive/Colab Notebooks/brics.csv")
print(d)
32
16
3/7/2022
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
34
17
3/7/2022
35
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
Thêm một cột bằng cách sử dụng một cột mới chưa có
37
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
39
40
20
3/7/2022
41
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
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 DataFrame
df = pd.DataFrame(d)
print ("Our data series is:")
print(df)
47
48
22
3/7/2022
49
50
23
3/7/2022
51
52
24
3/7/2022
Để 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
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
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)
55
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 DataFrame
df = pd.DataFrame(d)
print(df)
56
26
3/7/2022
57
58
27
3/7/2022
59
60
28
3/7/2022
61
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())
62
29
3/7/2022
63
64
30
3/7/2022
frame.rank(False)
65
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
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
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:
68
32
3/7/2022
69
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
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
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
Chọn nhiều hàng và một cột Chọn nhiều hàng và nhiều cột
73
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
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
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
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
iloc ()
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
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
79
iloc ()
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
iloc ()
81
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
82
39
3/7/2022
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
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
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
loc ()
86
41
3/7/2022
loc ()
Chọn hàng và cột bằng cách sử dụng đối tượng lát cắt
87
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
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
90
43
3/7/2022
Đọ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
Đọ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
93
Kĩ thuật reindexing
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
ordered = ['Jan','Apr','Jul','Oct']
quarterly_sales_2016.reindex(ordered)
95
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
quarterly_sales_2016.reindex(quarterly_sales_2017.index)
97
print(df)
98
47
3/7/2022
Để 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
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
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
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
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
itertuples()
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
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
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).
104
50
3/7/2022
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
105
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
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
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
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
df = pd.DataFrame(np.random.randn(5, 3),
index=['a', 'c', 'e', 'f', 'h'],
columns=['one', 'two', 'three'])
print(df)
NaN có nghĩa là Không phải số
109
Hàm isnull()
Hàm notnull()
110
53
3/7/2022
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
print(df)
print("NaN replaced with '0':")
print(df.fillna(0))
111
112
54
3/7/2022
113
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
114
55
3/7/2022
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
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
“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
Inner INNER JOIN Sử dụng các keys chung giữa hai bảng
117
Ví dụ minh họa
118
57
3/7/2022
Thực hiện phép join 2 dataframe với đối số mặc định how = inner
119
120
58
3/7/2022
121
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
123
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
124
60
3/7/2022
Ví dụ minh họa
!! 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
.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
Ví dụ minh họa
left.join(right, on='key')
127
128
62
3/7/2022
.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
Thay vì truyền vào left, right ta truyền vào left reset_index() và right.reset_index() tương tứng.
130
63
3/7/2022
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
Để 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
Minh họa một số thao tác có thể phối hợp làm sạch dữ liệu
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
134
65
3/7/2022
135
136
66
3/7/2022
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
Ví dụ minh họa
138
67
3/7/2022
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
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
141
df['float_col'] = df['float_col'].astype('int')
142
69
3/7/2022
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
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
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
Các chức năng tổng hợp sau khi thực hiện thao tác groupby
146
71
3/7/2022
Ví dụ minh họa
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
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
149
Đặ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
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
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
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 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
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
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
155
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()
156
76
3/7/2022
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
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
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
describe_option(param)
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
option_context()
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
BÀI TẬP
170
79
3/7/2022
THANK YOU
176
80