Xử lý dữ liệu bị thiếu là một phần thiết yếu của bất kỳ quy trình khoa học dữ liệu nào. Các phương pháp phổ biến được sử dụng để xử lý dữ liệu bị thiếu bao gồm [a] bỏ qua dữ liệu bị thiếu, [b] loại bỏ các bản ghi có dữ liệu bị thiếu hoặc [c] điền dữ liệu bị thiếu. Trong bài viết này, chúng ta sẽ xem xét các phương pháp khác nhau để điền dữ liệu còn thiếu vào thư viện Pandas bằng bộ dữ liệu đồ chơi chứa giá trái cây trong 4 ngày vào tháng 1 năm 2021
Hãy tạo bộ dữ liệu đồ chơi của chúng tôi
df = pd.DataFrame[{'date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04','2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'], 'fruit':['apple', 'apple', 'apple', 'apple', 'mango', 'mango', 'mango', 'mango'], 'price': [0.80, None, None, 1.20, None, 2.10, 2.00, 1.80]}]
df['date'] = pd.to_datetime[df['date']]
Trong tập dữ liệu này có 4 bản ghi bị thiếu giá trị được biểu thị bằng “NaN” và giá táo thường thấp hơn giá xoài
Hình ảnh của AuthorMethods
Điền vào giá trị không đổi
Hãy lấp đầy các giá còn thiếu với giá do người dùng xác định là 0. 85. Tất cả các giá trị còn thiếu trong cột giá sẽ được điền bằng cùng một giá trị
df['price'].fillna[value = 0.85, inplace = True]
Hình ảnh của tác giả
Điền vào giá trị trung bình / trung bình của cột
Chúng tôi có thể điền giá còn thiếu với giá trung bình hoặc giá trung bình của toàn bộ cột
# mean
df['price'].fillna[value = df.price.mean[], inplace = True]# median
df['price'].fillna[value = df.price.median[], inplace = True]
# mean0 và
df['price'].fillna[value = df.price.mean[], inplace = True]# median
df['price'].fillna[value = df.price.median[], inplace = True]
# mean1 trả về giá trị trung bình [1. 975] và trung bình [2. 0] giá tương ứng. Phương pháp
df['price'].fillna[value = df.price.mean[], inplace = True]# median
df['price'].fillna[value = df.price.median[], inplace = True]
# mean2 gán giá còn thiếu với giá trị trung bình hoặc giá trị trung bình đã cho
df['price'].fillna[value = df.price.mean[], inplace = True]# median
df['price'].fillna[value = df.price.median[], inplace = True]
Trái. giá bị thiếu được gán với giá trị trung bình. Đúng. giá bị thiếu được gán với trung bình. Hình ảnh của tác giả
Những mức giá này có vẻ quá cao so với giá táo và quá thấp so với giá xoài, do đó chúng ta có thể không muốn quy giá táo với giá trung bình [hoặc trung bình] của tất cả các loại trái cây. Thay vào đó, chúng ta có thể quy giá táo bị thiếu với giá trung bình [hoặc trung vị] chỉ của táo và làm tương tự với xoài. Điều này đưa chúng ta đến phương pháp tiếp theo để lấp đầy các giá trị còn thiếu bằng giá trị trung bình [hoặc trung vị] trong một nhóm cụ thể
Điền vào giá trị trung bình / Median của nhóm
Chúng tôi có thể điền vào các giá trị còn thiếu bằng cách sử dụng số liệu thống kê cấp nhóm theo cách sau
# mean
df['price'].fillna[df.groupby['fruit']['price'].transform['mean'], inplace = True]# median
df['price'].fillna[df.groupby['fruit']['price'].transform['median'], inplace = True]
Hãy chia đoạn mã trên thành hai bước
Bước 1. Tính giá trung bình cho mỗi loại trái cây và trả về một chuỗi có cùng số hàng như DataFrame ban đầu. Giá trung bình của táo và xoài là 1. 00 và 2. 95 tương ứng
df.groupby['fruit']['price'].transform['mean']
Bước 2. Điền vào các giá trị còn thiếu dựa trên đầu ra của bước 1
Hình ảnh của tác giả
Chuyển tiếp Điền
Điền chuyển tiếp, còn được gọi là viết tắt là "điền", truyền quan sát hợp lệ cuối cùng về phía trước dọc theo trục đã chọn của Khung dữ liệu [xuống dưới cột trong ví dụ của chúng tôi]
________số 8Hình ảnh của tác giả
Chúng ta có thể giới hạn số hàng mà quan sát hợp lệ cuối cùng được lan truyền bằng cách sử dụng đối số
# mean3. Ví dụ dưới đây cho thấy việc lan truyền chỉ giới hạn ở 1 bước sau lần quan sát hợp lệ cuối cùng. Giá bị thiếu cho quả táo vào ngày 2021-01-03 không được điền vì nó là 2 bước sau lần quan sát hợp lệ cuối cùng
df['price'].fillna[value = df.price.mean[], inplace = True]# median
df['price'].fillna[value = df.price.median[], inplace = True]
df['price'].fillna[value = 0.85, inplace = True]
0Hình ảnh của tác giả
Điền trước thay thế giá còn thiếu cho xoài vào năm 2020–01–01 bằng giá táo vào năm 2021–01–04. Điều này không có ý nghĩa gì vì nó không phải là sự so sánh táo với táo [không có ý định chơi chữ]. Do đó, chúng tôi có thể muốn áp dụng điền chuyển tiếp riêng cho từng loại trái cây. Chúng ta có thể làm như vậy bằng cách sử dụng phương thức điền trước với pandas groupby
Chuyển tiếp Điền trong Nhóm
Điền chuyển tiếp có thể được sử dụng cùng với groupby để thực hiện điền chuyển tiếp trong các nhóm cụ thể
Hình ảnh của Tác giả
df['price'].fillna[value = 0.85, inplace = True]
1Lưu ý rằng giá xoài bị thiếu vào năm 2021–01–01 không được lấp đầy bởi giá táo vào năm 2021–01–04 hiện tại vì táo và xoài hiện được coi là các nhóm khác nhau. Tương tự như ví dụ trước, chúng ta cũng có thể đặt tham số
# mean3 để giới hạn lan truyền ffill
df['price'].fillna[value = df.price.mean[], inplace = True]# median
df['price'].fillna[value = df.price.median[], inplace = True]
df['price'].fillna[value = 0.85, inplace = True]
3Hình ảnh của tác giả
điền lại
Điền ngược còn được gọi là “bfill” viết tắt là ngược lại với điền trước. Quan sát hợp lệ đầu tiên sau khi giá trị “NaN” được xác định và lan truyền ngược dọc theo trục đã chọn [lên trên cột trong ví dụ của chúng tôi]
df['price'].fillna[value = 0.85, inplace = True]
4Hình ảnh của tác giả
Tương tự, chúng ta cũng có thể giới hạn số hàng mà quan sát hợp lệ được lan truyền bằng cách sử dụng tham số
# mean3
df['price'].fillna[value = df.price.mean[], inplace = True]# median
df['price'].fillna[value = df.price.median[], inplace = True]
df['price'].fillna[value = 0.85, inplace = True]
0Điền ngược trong các nhóm
Tương tự như điền về phía trước, chúng tôi cũng có thể thực hiện điền ngược chỉ trong các nhóm cụ thể và hạn chế sự lan truyền của nó
df['price'].fillna[value = 0.85, inplace = True]
1Kết hợp FFill và BFill
Chúng ta cũng có thể điền vào một cột bằng điền trước, sau đó điền ngược lại thông qua chuỗi phương thức
df['price'].fillna[value = 0.85, inplace = True]
2Hình ảnh của tác giả
Hãy lưu ý rằng thứ tự của các vấn đề
# mean6 và
df['price'].fillna[value = df.price.mean[], inplace = True]# median
df['price'].fillna[value = df.price.median[], inplace = True]
# mean7. Nếu chúng ta hoán đổi thứ tự, điền ngược sẽ được thực hiện trước, sau đó điền tiếp, dẫn đến một kết quả khác
df['price'].fillna[value = df.price.mean[], inplace = True]# median
df['price'].fillna[value = df.price.median[], inplace = True]
df['price'].fillna[value = 0.85, inplace = True]
3Hình ảnh của tác giả
nội suy
Nội suy là một phương pháp ước tính [các] giá trị của [các] điểm dữ liệu mới nằm giữa một dải các điểm dữ liệu rời rạc đã biết. Chúng ta có thể áp dụng phép nội suy tuyến tính với Pandas theo cách sau
df['price'].fillna[value = 0.85, inplace = True]
4Nội suy tuyến tính giả định rằng các giá trị cách đều nhau. Các giá trị bị thiếu cho apple vào 2021–01–02 và 2021–01–03 được điền bằng 0. 933 và 1. 067 nơi giá đang tăng trong khoảng thời gian 0. 133
Hình ảnh của tác giả
Sử dụng phép nội suy tuyến tính theo cách này để điền vào giá xoài còn thiếu vào năm 2021–01–01 không có ý nghĩa vì chúng tôi đang thực hiện phép nội suy dựa trên giá táo vào năm 2021–01–04 và giá xoài vào năm 2021–01–02. Hãy thử thực hiện phép nội suy riêng cho từng loại trái cây
Nội suy trong Nhóm
Chúng ta có thể thực hiện nội suy trong các nhóm cụ thể theo cách sau
df['price'].fillna[value = 0.85, inplace = True]
5Giá xoài vào ngày 2021–01–01 là “Nan” do không có đủ điểm dữ liệu để thực hiện nội suy. Nội suy tuyến tính yêu cầu ít nhất 2 điểm dữ liệu đã biết, tuy nhiên không có điểm dữ liệu nào cho xoài trước năm 2021–01–01
Hình ảnh của tác giả
Giả sử rằng giá của xoài là như nhau vào năm 2021–01–01 và 2021–01–02, chúng ta có thể điền giá còn thiếu bằng cách điền ngược. Hãy thực hiện cả nội suy và điền ngược theo trình tự bằng cách xâu chuỗi cả hai phương thức lại với nhau
df['price'].fillna[value = 0.85, inplace = True]
6Hình ảnh của tác giả
Điền giá trị dựa trên điều kiện
Có thể có trường hợp chúng tôi muốn xác định cách điền các giá trị bị thiếu dựa trên các giá trị trong các cột khác. Ví dụ, giá trái cây có thể đắt hơn vào cuối tuần so với các ngày trong tuần. Vì vậy, chúng tôi muốn điền giá còn thiếu theo cách sau
Hình ảnh của tác giả
Trước tiên, chúng ta sẽ cần xác định ngày nào là cuối tuần và ngày trong tuần bằng cách tạo một cột boolean trong đó
# mean8 biểu thị các ngày trong tuần và
df['price'].fillna[value = df.price.mean[], inplace = True]# median
df['price'].fillna[value = df.price.median[], inplace = True]
# mean9 biểu thị các ngày cuối tuần
df['price'].fillna[value = df.price.mean[], inplace = True]# median
df['price'].fillna[value = df.price.median[], inplace = True]
df['price'].fillna[value = 0.85, inplace = True]
7Sau đó, chúng tôi xác định giá trung bình cho mỗi loại trái cây
df['price'].fillna[value = 0.85, inplace = True]
8Cuối cùng, chúng tôi điền vào các giá trị còn thiếu dựa trên các điều kiện đã cho pandas ____ phương pháp
# mean0
df['price'].fillna[df.groupby['fruit']['price'].transform['mean'], inplace = True]# median
df['price'].fillna[df.groupby['fruit']['price'].transform['median'], inplace = True]
df['price'].fillna[value = 0.85, inplace = True]
9Hình ảnh của Tác giảKết luận
Trong bài viết này, chúng tôi đã kiểm tra các phương pháp sau đây để điền các giá trị còn thiếu bằng cách sử dụng Pandas
- phi lê
- Chuyển tiếp Điền
- điền lại
- nội suy
Việc lựa chọn phương pháp điền phụ thuộc vào các giả định và bối cảnh của vấn đề. Ví dụ: điền các giá trị còn thiếu của xoài bằng giá trung bình của táo và xoài có thể không phải là ý kiến hay vì táo và xoài có giá khá khác nhau trong bộ dữ liệu đồ chơi của chúng tôi
Chúng tôi cũng xem cách sử dụng từng phương pháp này cùng với phương pháp pandas
# mean1 để điền các giá trị còn thiếu cho từng nhóm riêng biệt
df['price'].fillna[df.groupby['fruit']['price'].transform['mean'], inplace = True]# median
df['price'].fillna[df.groupby['fruit']['price'].transform['median'], inplace = True]