Xử lý các ô dữ liệu trống

Xử lý các ô dữ liệu trống với Python

Tập hợp những câu lệnh hữu ích cho việc xử lý dữ liệu trống (Missing data) bằng Python

Kiểm tra thiếu dữ liệu

pandas.isnull()

Mô tả

Để kiểm tra nhanh một bảng dữ liệu (data frame), một dãy (array), một cột dữ liệu (Pandas Series) hoặc cột địa chỉ (Index) có bị thiếu dữ liệu hay không, bạn có thể dùng hàm pandas.isnull()

Tham số
Tên Kiểu dữ liệu Mô tả
obj scalar, array (dãy) hoặc tương tự array  Đối tượng cần được kiểm tra thiếu dữ liệu
Đầu ra

Kiểu dữ liệu đầu ra: bool hoặc một dãy các giá trị bool

Đầu ra của hàm này sẽ là một giá trị True/False hoặc một dãy các giá trị True/False tuỳ thuộc vào đối tương đầu vào.

Ví dụ
# Khai báo các gói thư viện cần dùng
import pandas as pd
import numpy as np

# Kiểm tra một giá trị đơn lẻ
pd.isna('dog')
# False
pd.isna(pd.NA)
# True
pd.isna(np.nan)
# True

# Kiểm tra một dãy dữ liệu numpy
array = np.array([[1, np.nan, 3], [4, 5, np.nan]])
array
# array([[ 1., nan, 3.],
# [ 4., 5., nan]])
pd.isna(array)
# array([[False, True, False],
# [False, False, True]])

# Kiểm tra cột địa chỉ
index = pd.DatetimeIndex(["2017-07-05", "2017-07-06", None,
"2017-07-08"])
index
# DatetimeIndex(['2017-07-05', '2017-07-06', 'NaT', '2017-07-08'],
# dtype='datetime64[ns]', freq=None)
pd.isna(index)
# array([False, False, True, False])

# Kiểm tra một bảng dữ liệu data frame
df = pd.DataFrame([['ant', 'bee', 'cat'], ['dog', None, 'fly']])
df
#  0 1 2
# 0 ant bee cat
# 1 dog None fly
pd.isna(df)
# 0 1 2
# 0 False False False
# 1 False True False

# Kiểm tra một cột trong bảng dữ liệu (pd.Series)
pd.isna(df[1])
# 0 False
# 1 True
# Name: 1, dtype: bool

Loại bỏ các ô dữ liệu trống

Trong trường hợp bạn cần loại bỏ các ô dữ liệu trống thì sau đây là những hàm bạn có thể dùng.

df.dropna()

Mô tả

Hàm dropna() áp dụng trên đối tượng DataFrame và được dùng để loại bỏ các ô dữ liệu trống.

Tham số
Tên Kiểu dữ liệu Mô tả
axis 0 hoặc 1 (mặc định là 0)

0: Xoá dòng chứa ô dữ liệu trống

1: Xoá cột chứ ô dữ liệu trống

how any hoặc all (mặc định là any)

any: xoá dòng hoặc cột nếu có bất kỳ ô NA nào hiện diện

all: xoá dòng hoặc cột nếu toàn bộ dòng hoặc cột này bị trống (NA)

thresh int (có thể bỏ qua) Xác định số lượng ô chứa NA tối thiểu cần thiết để loại bỏ dòng hoặc cột
subset array (có thể bỏ qua) Tiêu đề của dòng hoặc cột cần loại bỏ. Ví dụ nếu chọn axis = 0 (loại bỏ dòng) thì subset sẽ là tên các cột muốn loại bỏ trên dòng đó.
inplace bool (Mặc định là False)

Nếu được đặt giá trị True, việc loại bỏ sẽ được áp dụng ngay lập tức lên DataFrame gốc mà không cần gán ở đầu ra.

Ở giá trị False, bạn phải gán thay đổi này vào một DataFrame khác hoặc DataFrame gốc ở đầu ra. 

Đầu ra

DataFrame đầu ra sau khi đã loại bỏ các dữ liệu trống

Ví dụ
# Tạo dataframe mới
df = pd.DataFrame({"name": ['Alfred', 'Batman', 'Catwoman'],
                   "toy": [np.nan, 'Batmobile', 'Bullwhip'],
                   "born": [pd.NaT, pd.Timestamp("1940-04-25"),
                            pd.NaT]})
# df
#        name        toy       born
# 0    Alfred        NaN        NaT
# 1    Batman  Batmobile 1940-04-25
# 2  Catwoman   Bullwhip        NaT

# Loại bỏ dòng nếu có bất kỳ ô dữ liệu trống nào
df.dropna()
#      name        toy       born
# 1  Batman  Batmobile 1940-04-25

# Loại bỏ cột nếu có bất kỳ ô dũ liệu trống nào
df.dropna(axis='columns')
#        name
# 0    Alfred
# 1    Batman
# 2  Catwoman

# Loại bỏ dòng nếu tất cả các ô đều trống
df.dropna(how='all')
#        name        toy       born
# 0    Alfred        NaN        NaT
# 1    Batman  Batmobile 1940-04-25
# 2  Catwoman   Bullwhip        NaT

# Loại bỏ nhưng giữ lại những dòng có ít nhất 2 ô chứa dữ liệu (không bị trống)
df.dropna(thresh=2)
#        name        toy       born
# 1    Batman  Batmobile 1940-04-25
# 2  Catwoman   Bullwhip        NaT

# Xác định cụ thể cột cần kiểm tra và loại bỏ nếu có chứa ô trống
df.dropna(subset=['name', 'born'])
#        name        toy       born
# 1    Batman  Batmobile 1940-04-25

# Loại bỏ dữ liệu trống và áp dụng thay đổi ngay trên DataFrame gốc
df.dropna(inplace=True)
# df
#      name        toy       born
# 1  Batman  Batmobile 1940-04-25

Thay thế các ô dữ liệu trống

Trong trường hợp bạn không muốn loại bỏ mà cần thay thế những ô trống bằng một giá trị nào đó chẳng hạn như giá trị trung bình của dòng hoặc cột thì sau đây là những hàm bạn có thể dùng:

df.fillna(x)

Mô tả

Đây là hàm thay thế ô dữ liệu trống bằng giá trị x, tuỳ thuộc vào nhu cầu xử lý dữ liệu mà bạn có thể thay x bằng các giá trị khác nhau (xem thêm bên dưới).

Tham số
Tên Kiểu dữ liệu Mô tả
 value  scalar, dict, Series,hoặc DataFrame  Giá trị dùng để thay thế các ô trống
 method  {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, default None

 Phương thức điền giá trị vào ô trống:

backfill/bfill: Sử dụng giá trị ở ô chứa dữ liệu kế tiếp để điền vào ô trống hiện tại

pad/fill: Sử dụng giá trị ở ô chứa dữ liệu trước đó để điền vào ô trống hiện tại

 axis  {0 or ‘index’, 1 or ‘columns’} Điền dữ liệu vào ô trống theo dòng hoặc cột
inplace bool, default False  

Nếu được đặt giá trị True, việc loại bỏ sẽ được áp dụng ngay lập tức lên DataFrame gốc mà không cần gán ở đầu ra.

Ở giá trị False, bạn phải gán thay đổi này vào một DataFrame khác hoặc DataFrame gốc ở đầu ra. 

 limit  int, default None  Độ dài tối đa của chuỗi các ô trống liên tiếp cần được điền bởi phương thức backfill hoặc fill. Nếu độ dài của chuỗi ô trống liên tiếp lớn hơn giá trị này, chỉ một phần của chuỗi sẽ ô trống được điền. Ví dụ nếu có 10 ô trống nằm cạnh nhau, và bạn đặt giá trị 8 cho tham số limit thì chỉ có 8 ô đầu được điền giá trị  trong khi 2 ô còn lại sẽ bị bỏ qua.
Ví dụ

 

# Tạo một DataFrame mới
df = pd.DataFrame([[np.nan, 2, np.nan, 0],
                   [3, 4, np.nan, 1],
                   [np.nan, np.nan, np.nan, 5],
                   [np.nan, 3, np.nan, 4]],
                  columns=list('ABCD'))
# df
#      A    B   C  D
# 0  NaN  2.0 NaN  0
# 1  3.0  4.0 NaN  1
# 2  NaN  NaN NaN  5
# 3  NaN  3.0 NaN  4

# Thay tất cả các ô trống bằng giá trị 0
df.fillna(0)
#     A   B   C   D
# 0   0.0 2.0 0.0 0
# 1   3.0 4.0 0.0 1
# 2   0.0 0.0 0.0 5
# 3   0.0 3.0 0.0 4

# Thay các ô trống bằng giá trị liền kề trước đó trong cùng một cột
df.fillna(method='ffill')
#     A   B   C   D
# 0   NaN 2.0 NaN 0
# 1   3.0 4.0 NaN 1
# 2   3.0 4.0 NaN 5
# 3   3.0 3.0 NaN 4

# Tuỳ chọn thay thế ô trống (NaN) bằng các giá trị khác nhau cho từng cột
values = {'A': 0, 'B': 1, 'C': 2, 'D': 3}
df.fillna(value=values)
#     A   B   C   D
# 0   0.0 2.0 2.0 0
# 1   3.0 4.0 2.0 1
# 2   0.0 1.0 2.0 5
# 3   0.0 3.0 2.0 4

# Chỉ thay thế ô trống đầu tiên của từng cột
df.fillna(value=values, limit=1)
#     A   B   C   D
# 0   0.0 2.0 2.0 0
# 1   3.0 4.0 NaN 1
# 2   NaN 1.0 NaN 5
# 3   NaN 3.0 NaN 4

# Thay giá trị NaN bằng trung bình của cột
df.fillna(df.mean())
#     A   B   C   D
# 0 3.0 2.0 NaN 0
# 1 3.0 4.0 NaN 1
# 2 3.0 3.0 NaN 5
# 3 3.0 3.0 NaN 4

   

Sản phẩm của
Be Ready Education Australia

14 Mercantour Boulevard, Tarneit 3029
Melbourne, Victoria, Australia

ABN 80 626 694 344

Log in

Notice: Trying to access array offset on value of type null in /home/datascie/public_html/templates/gk_university/layouts/blocks/tools/login.php on line 21
" /> create an account