Tải bản đầy đủ (.docx) (77 trang)

Cẩm nang máy học với Python: Chapter 3: Sắp xếp dữ liệu (data wrangling)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.71 MB, 77 trang )

CHƯƠNG 3: SẮP XẾP DỮ LIỆU

Giới thiệu
Data wrangling (Sắp xếp dữ liệu) là một thuật ngữ rộng
được sử dụng, thường khơng chính thức, để mơ tả q trình
chuyển đổi dữ liệu thơ thành định dạng rõ ràng, có tổ chức, sẵn
sàng để sử dụng. Đối với chúng ta, việc sắp xếp dữ liệu chỉ là
một bước trong quá trình xử lý trước dữ liệu, nhưng đây là một
bước quan trọng.
Cấu trúc dữ liệu phổ biến nhất được sử dụng để “sắp xếp”
dữ liệu là khung dữ liệu (Dataframe), có thể vừa trực quan vừa
cực kỳ linh hoạt. Các khung dữ liệu có dạng bảng, nghĩa là
chúng dựa trên các hàng và cột như bạn thấy trong bảng tính.
Có hai điều quan trọng cần lưu ý trong khung dữ liệu:.
- Đầu tiên, trong khung dữ liệu, mỗi hàng tương ứng với một
quan sát (ví dụ: một hành khách) và mỗi cột tương ứng với một
đặc điểm (giới tính, tuổi, v.v.).
- Thứ hai, mỗi cột chứa một tên (ví dụ: Tên, PClass, Tuổi) và mỗi
hàng chứa một số chỉ mục (ví dụ: 0 dành cho cô Elisabeth
Walton Allen). Chúng ta sẽ sử dụng những thông tin này để lựa
chọn và thao tác các quan sát và đặc điểm.
Trong chương này, chúng tôi sẽ đề cập đến nhiều kỹ thuật
khác nhau để thao tác khung dữ liệu bằng thư viện pandas với
mục tiêu tạo ra một tập hợp các quan sát có cấu trúc rõ ràng, rõ
ràng để xử lý trước.
Tạo một series của dataframe
Pandas Series là một container 1 chiều của Pandas (hay
còn gọi là Python Iterable) tương tự như list là một container có


sẵn của Python. Nó chính là một loại dữ liệu tượng trưng cho


mỗi cột trong Dataframe. Mỗi giá trị của series phải được lưu trữ
cùng loại data type. Ví dụ chúng ta có một giá trị là 1 (interger)
và một giá trị là “orange” (string) trong cùng một series thì
series đó sẽ có data type là object dtype (hay là string trong
Python).
Vì Dataframe được xem như là một dictionary các series
objects trong đó mỗi key chính là tên cột và value chính là
series, chúng ta có thể kết luận rằng series tương đương với
Python list, ngoại trừ việc các giá trị của series phải cùng dtype
trong khi các giá trị của list có thể khác dtype. Chúng ta cũng
thấy rằng ndarray cũng sẽ có cấu trúc tương tự series.
Các dễ nhất để tạo series chính là truyền một list Python
vào methods series() của pandas. Nếu chúng ta truyền một list
gồm nhiều giá trị thuộc các dtype khác nhau thì pandas sẽ tự
động chọn dtype phổ biến nhất trong list đó.

Chúng ta thấy bên trái series chính là các hàng số, đó
chính là index number của series. Nó cũng tương tự như row
name và row index. Do đó chúng ta có thể đặt tên cho row
index.


Trong code cell trên chúng ta dùng parameter index để chỉ
định row number o là person và row number 1 là Who. Do đó
khi kết quả trình bày Person cho wes Mckinney và Who trình
bày cho Creatoe of pandas.
Khi sử dụng hàm print với series thì index sẽ được trình
bày dưới dạng cột thứ nhất và các giá trị được trình bày ở cột
thứ hai.


Nếu chúng ta chỉ muốn trình bày index của series thì
chúng ta thêm atrribute index hoặc dùng method key

Nếu chúng ta chỉ muốn biết index đầu tiên của series thì
chúng ta thêm [0] với attribute index và [0] với method key()


Nếu chúng ta chỉ muốn trình bày giá trị của series thì
chúng ta chỉ cần dùng methods values

Tính chất của một series định lượng (hay còn gọi là vector số)
Nếu trường hợp chúng ta có hai vector có cùng độ dài thì chúng
ta có thể cộng từng hàng hai vector đó lại với nhau

Hoặc chúng ta nhân hai vector cùng độ dài lại với nhau


Khi chúng ta áp dụng một phép toán lên vector với một con số,
thì con số này sẽ được tái sử dụng cho tất cả các thành tố của
vector

Nếu hai series định lượng có chiều dài khơng bằng nhau thì
pandas sẽ cộng các hàng có cùng index ở hai series cịn các
hàng khơng có giá trị sẽ được để giá trị missing kí hiệu là NaN.


Trong code trên series thứ hai chỉ có hai giá trị 1 và 100 tương
ứng ở index number 0 và 1, do đó Python sẽ chỉ cộng age và
series [1, 100] ở hai hàng có index 0 và 1 mà thơi.
Một đặc điểm hay nữa của Python chính là nó ln thực hiện các

phép tốn cho hai series dựa hồn tồn vào index number, bất
kể cho dù chúng ta có đảo thứ tự của các hàng như thế nào
chăng nữa. Đó là do Python ln ln gắn một index number
mặc định cho một giá trị bất kì, do đó khi thay đổi thứ tự của
series thì giá trị đó vẫn ln có index đó.

Giả sử ta có series age và series rev_ages nghĩa là series ages
xếp từ cao đến thấp.
Chúng ta nhận thấy index number của giá trị 37 vẫn là 0 cho dù
đã được sắp xếp lại thứ tự trong rev_ages.
Khi cộng hai series này lại Python cũng tự động cộng các hàng
có trùng số index number.


Tạo một Dataframe
Tạo Dataframe từ Python dictionary
pandas có nhiều phương thức để tạo đối tượng DataFrame
mới. Một phương pháp dễ dàng là khởi tạo DataFrame bằng
dictionary của Python. Trong từ điển, mỗi khóa là một tên cột và
giá trị là một danh sách, trong đó mỗi mục tương ứng với một
hàng:
# Load library
import pandas as pd
# Create a dictionary
dictionary = {
"Name": ['Jacky Jackson', 'Steven Stevenson'],
"Age": [38, 25],
"Driver": [True, False]
}



# Create DataFrame
dataframe = pd.DataFrame(dictionary)
# Show DataFrame
dataframe
Name

Ag

Driv

e

er

0

Jacky Jackson

38

True

1

Steven

25

False


Stevenson
Chúng ta cũng có thể dễ dàng thêm cột mới và Dataframe:
# Add a column for eye color
dataframe["Eyes"] = ["Brown", "Blue"]
# Show DataFrame
dataframe
Name
0

Jacky Jackson

Ag

Driv

e

er

38

True

Eyes
Brow
n

1


Steven

25

False

Blue

Stevenson
pandas cung cấp vô số cách để tạo DataFrame. Tuy nhiên
trong thực tế, việc tạo một DataFrame trống rồi điền vào hầu
như khơng bao giờ xảy ra. Thay vào đó, DataFrames của chúng
ta sẽ được tạo từ dữ liệu thực mà chúng tơi đã tải từ các nguồn
khác (ví dụ: tệp CSV hoặc cơ sở dữ liệu).


Khi tạo Dataframe chúng ta có thể thêm hai tham số là
index và columns. Index columns sẽ giúp chúng ta quy định row
index của Dataframe thay vì dùng row number mặc định của
Python. Còn tham số columns giúp chúng ta quy định thứ tự của
các columns.

Trong code cell trên, chúng ta lấy cột name trước đó trở
thành row index cho Dataframe. Chúng ta cũng thiết lập thứ tự
các cột bằng colunns tham số.
Tính chất của một Dataframe
Một Dataframe gồm 3 phần: index, column và values. Để xem
ba thành phần này chúng ta dùng thuộc tính index, column và
values của Dataframe.


Với thuộc tính index chúng ta thấy index của bộ Dataframe này
bắt đầu từ 0 và kết thúc ở 8, mỗi index cách nhau 1 đơn vị

Hoặc


Với thuộc tính column chúng có thể xem được tên các cột trong
dataframe

Thuộc tính values rất có ích khi chúng ta không muốn liệt kê
các index label mà chỉ muốn hiển thị các giá trị dưới dạng array
của numpy.
Dataframe vì được cấu trúc từ series nên nó cũng có tính chất
broadcasting nghĩa là chúng ta có thể thực hiện các phép tốn
với tồn bộ Dataframe

Trong đoạn code trên chúng ta lấy Dataframe scientist nhân
cho 2 thì chúng ta được kết quả là giá trị của các cột string sẽ
được nhân lên hai còn giá trị của cột số sẽ được gấp đôi lên.


Tóm tắt dataframe
Kiểm tra lớp của dữ liệu
Khi dữ liệu tải vào Python có thể có nhiều lớp khác nhau
như pandas dataframe, series, array v.v. Để kiểm tra class của
dữ liệu chúng ta dùng hàm type có sẵn của Python (hàm này
được cài sẵn trong Python không phải từ các thư viện riêng như
pandas).

Hàm type rất có ích khi bạn phải làm việc với nhiều đối

tượng Python và bạn muốn biết đối tượng đó thuộc loại gì.
Như vậy dữ liệu df ở trên thuộc loại pandas dataframe.
Xem số hàng, số cột của dataframe
Mỗi dataframe của panda sẽ có thuộc tính shape nghĩa là
cho chúng ta biết được số hàng và số dịng của nó.

Thuộc tính shape của dataframe sẽ trả về một tuple trong
đó con số đầu tiên là số hàng và con số thứ hai là số cột.
Xem tên các cột của Dataframe
Chúng ta sử dụng method columns để biết tên các cột
trong Dataframe


Xem loại dữ liệu của các biến trong dataframe
Để biết loại dữ liệu của từng cột chúng ta có thể dùng
thuộc tính dtypes hay dùng method info()

Trong pandas có các loại dữ liệu sau và tương ứng trong
Python là các loại dữ liệu khác nhau

Xem 5 hàng đầu của dataframe
Trong trường hợp dataframe của chúng ta quá lớn chúng
ta không thể liệt kê toàn bộ các hàng của dataframe. Chúng ta


chỉ xem được một subset của nó mà thơi. Method head() của
dataframe cho phép chúng ta xem dữ liệu của 5 hàng đầu tiên
của dataframe.

Xem 5 hàng cuối cùng của dataframe


Chúng ta dùng method tail() để xem 5 hàng cuối cùng của
dataframe.
Mô tả các số tập trung và phân tán của biến định lượng
trong Dataframe
Chúng ta có thể tóm tắt các số thống kê của các biến định
lượng trong Dataframe bằng cách dùng hàm describe:
# Show statistics
dataframe.describe()


Mô tả min, max, mean, sum và count của một biến định lượng
trong Dataframe
# Load library
import pandas as pd
# Create URL
url

=

' />titanic.csv'
# Load data
dataframe = pd.read_csv(url)
# Calculate statistics
print('Maximum:', dataframe['Age'].max())
print('Minimum:', dataframe['Age'].min())
print('Mean:', dataframe['Age'].mean())
print('Sum:', dataframe['Age'].sum())
print('Count:', dataframe['Age'].count())
Maximum: 71.0

Minimum: 0.17


Mean: 30.397989417989415
Sum: 22980.879999999997
Count: 756
Ngoài các số liệu thống kê được sử dụng trong code trên,
pandas còn cung cấp phương sai (var), độ lệch chuẩn (std), độ
nhọn (kurt), độ lệch (skew), sai số chuẩn của giá trị trung bình
(sem), mode (mode), trung vị (trung vị) ) ), đếm số giá trị và
một số giá trị thống kê khác.
Mô tả count của tất cả các biến trong Dataframe
# Show counts
dataframe.count()
Name

1313

PClass

1313

Age

756

Sex

1313


Survived
SexCode

1313
1313

dtype: int64
Mô tả min của tất cả các biến trong Dataframe
# Load library
import pandas as pd
# Create URL
url =
' />titanic.csv'
# Load data
dataframe = pd.read_csv(url)


# Get the minimum of every column
dataframe.agg("min")
Name

Abbing, Mr Anthony

PClass

*

Age

0.17


Sex

female

Survived

0

SexCode

0

dtype: object
Mô tả số tập trung và phân tán cho tất cả các biến trong
Dataframe
# Mean Age, min and max SexCode
dataframe.agg({"Age":["mean"], "SexCode":["min", "max"]})
Ag

SexCod

e

e

mean

30.3979


Na

89

N

min

NaN

0.0

max

NaN

1.0

Mô tả các giá trị của biến phân loại trong Dataframe
# Load library
import pandas as pd
# Create URL


url

=

' />titanic.csv'
# Load data

dataframe = pd.read_csv(url)
# Select unique values
dataframe['Sex'].unique()
array(['female', 'male'], dtype=object)
Để đếm số giá trị của biến phân loại chúng ta dùng hàm
nunique
# Show number of unique values
dataframe['PClass'].nunique()
4
Mô tả tần suất của một biến phân loại trong Dataframe
# Show counts
dataframe['Sex'].value_counts()
male
female

851
462

Name: Sex, dtype: int64
Mô tả tần suất cho hai biến phân loại trong Dataframe
# Number of people who survived and didn't survive in each
class
dataframe.groupby(
["PClass","Survived"]).agg({"Survived":["count"]}
).reset_index()


PCla

Surviv


Cou

ss

ed

nt

0

*

0

1

1

1st

0

129

2

1st

1


193

3

2nd

0

160

4

2nd

1

119

5

3rd

0

573

6

3rd


1

138

Các hàm tổng hợp đặc biệt hữu ích trong quá trình phân
tích dữ liệu khám phá để tìm hiểu thơng tin về các nhóm dữ liệu
khác nhau và mối quan hệ giữa các biến. Bằng cách nhóm dữ
liệu và áp dụng số liệu thống kê tổng hợp, bạn có thể xem các
mẫu trong dữ liệu có thể hữu ích trong q trình học máy hoặc
kỹ thuật tính năng. Mặc dù biểu đồ trực quan cũng hữu ích
nhưng việc có số liệu thống kê mô tả cụ thể như vậy làm tài liệu
tham khảo để hiểu rõ hơn về dữ liệu thường rất hữu ích.
Mơ tả biến định lượng theo biến phân loại trong Dataframe
Chúng ta có thể dùng lệnh groupby để tóm tắt biến định
lượng theo biến định tính.
# Load library
import pandas as pd
# Create URL


url =
' />titanic.csv'
# Load data
dataframe = pd.read_csv(url)
# Group rows by the values of the column 'Sex', calculate mean
# of each group
dataframe.groupby('Sex').mean(numeric_only=True)
Se


Age

x

Surviv

SexCo

ed

de
1.0

femal

29.3964

0.6666

e

24

67

male

31.0143

0.1668


38

63

0.0

groupby là nơi việc sắp xếp dữ liệu thực sự bắt đầu hình
thành. Điều rất phổ biến là có một DataFrame trong đó mỗi
hàng là một người hoặc một sự kiện và chúng ta muốn nhóm
chúng theo một số tiêu chí rồi tính tốn một thống kê. Ví dụ:
bạn có thể tưởng tượng một DataFrame trong đó mỗi hàng là
một lần bán hàng riêng lẻ tại một chuỗi nhà hàng quốc gia và
chúng ta muốn tổng doanh số bán hàng của mỗi nhà hàng.
Chúng ta có thể thực hiện điều này bằng cách nhóm các hàng
theo từng nhà hàng rồi tính tổng của từng nhóm.
Người dùng mới sử dụng groupby thường viết một dòng
như thế này và bối rối trước những gì được trả về:
# Group rows


dataframe.groupby('Sex')
0x10efacf28>
Tại sao nó khơng trả lại thứ gì đó hữu ích hơn? Lý do là
groupby cần phải được ghép nối với một số thao tác mà chúng
tôi muốn áp dụng cho từng nhóm, chẳng hạn như tính tốn một
thống kê tổng hợp (ví dụ: trung bình, trung vị, tổng). Khi nói về
việc phân nhóm chúng ta thường dùng cách viết tắt là “nhóm
theo giới tính”, nhưng như vậy chưa đầy đủ. Để việc nhóm trở

nên hữu ích, chúng ta cần nhóm theo thứ gì đó và sau đó áp
dụng một hàm cho từng nhóm đó:
# Group rows, count rows
dataframe.groupby('Survived')['Name'].count()
Survived
0

863

1

450

Name: Name, dtype: int64
Lưu ý [Name] sau groupby? Đó là vì số liệu thống kê tóm
tắt cụ thể chỉ có ý nghĩa đối với một số loại dữ liệu nhất định. Ví
dụ: trong khi việc tính độ tuổi trung bình theo giới tính là hợp lý
thì việc tính tổng độ tuổi theo giới tính lại khơng hợp lý. Trong
trường hợp này, chúng tơi nhóm dữ liệu thành sống sót hay
khơng, sau đó đếm số lượng tên (tức là hành khách) trong mỗi
nhóm.
Chúng ta cũng có thể nhóm theo cột đầu tiên, sau đó
nhóm nhóm đó theo cột thứ hai:
# Group rows, calculate mean
dataframe.groupby(['Sex','Survived'])['Age'].mean()
Sex

Survived

female 0


24.901408



×