Tôi phải thừa nhận, dữ liệu trong thế giới thực luôn lộn xộn và hiếm khi ở dạng sạch. Nó chứa tên cột không chính xác hoặc viết tắt, thiếu dữ liệu, loại dữ liệu không chính xác, quá nhiều thông tin trong một cột, v.v.
Điều quan trọng là phải khắc phục những sự cố này trước khi xử lý dữ liệu. Cuối cùng, dữ liệu sạch luôn giúp tăng năng suất và cho phép bạn tạo thông tin chi tiết chính xác, tốt nhất
Vì vậy, mình liệt kê 3 kiểu dọn dẹp dữ liệu bạn phải biết khi xử lý bằng Python
Để làm ví dụ, tôi đang sử dụng phiên bản mở rộng của tập dữ liệu Titanic do Pavlo Fesenko tạo, được cung cấp miễn phí theo giấy phép CC
Bộ dữ liệu Titanic. Hình ảnh của tác giả
Đây là tập dữ liệu đơn giản với 1309 hàng và 21 cột. Tôi đã trình bày dưới đây rất nhiều ví dụ về cách bạn có thể tận dụng tốt nhất dữ liệu này
Bắt đầu nào. 🚀
Trước tiên, hãy nhập pandas và đọc tệp csv này trong pandas DataFrame. Đó là một cách thực hành tốt để có được cái nhìn tổng quan đầy đủ về kích thước của tập dữ liệu, các cột và loại dữ liệu tương ứng của chúng bằng phương pháp
columns_to_drop = ['PassengerId', 'SibSp',5
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
df = pd.read_csv["Complete_Titanic_Extended_Dataset.csv"]
df.info[]
df. info[] để có cái nhìn tổng quan về tập dữ liệu. Hình ảnh của tác giả
Trước tiên, hãy bắt đầu với các bước dọn dẹp dễ dàng nhất có thể tiết kiệm một số bộ nhớ và thời gian cũng như bạn tiếp tục xử lý
Xóa các cột không sử dụng và không liên quanBạn có thể nhận thấy, bộ dữ liệu này chứa 21 cột và bạn sẽ hiếm khi sử dụng tất cả chúng cho nhiệm vụ phân tích dữ liệu của mình. Do đó, chỉ chọn các cột cần thiết
Ví dụ, giả sử bạn yêu cầu bạn không cần các cột
columns_to_drop = ['PassengerId', 'SibSp',6,
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',0,
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',1,
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',2,
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',3 và
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',4
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
Tất cả những gì bạn cần làm là tạo một danh sách các tên cột này và sử dụng nó trong hàm
columns_to_drop = ['PassengerId', 'SibSp',5 như hình bên dưới
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
Chỉ giữ các cột có liên quan. Hình ảnh của tác giả
Khi bạn kiểm tra mức tiêu thụ bộ nhớ bằng cách sử dụng đối số
columns_to_drop = ['PassengerId', 'SibSp',6 trong phương pháp
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',5, bạn sẽ nhận thấy tập dữ liệu mới được tạo này chỉ tiêu thụ 834 KB so với 1000 KB cho DataFrame gốc
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
Những con số này có thể trông nhỏ ở đây nhưng sẽ lớn đáng kể khi bạn xử lý các bộ dữ liệu lớn
Vì vậy, việc loại bỏ các cột không liên quan đã tiết kiệm được 17% bộ nhớ
Một nhược điểm nhỏ của việc loại bỏ các cột bằng phương pháp
columns_to_drop = ['PassengerId', 'SibSp',8 là nó làm thay đổi Khung dữ liệu ban đầu khi bạn sử dụng
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',9. Nếu bạn vẫn quan tâm đến DataFrame ban đầu, bạn có thể gán đầu ra
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',10 [không có tại chỗ] cho một biến khác, như bên dưới
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',1
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
Ngoài ra, một tình huống có thể xảy ra khi bạn muốn loại bỏ một số lượng lớn cột và chỉ giữ lại 4–5 cột. Trong trường hợp đó, thay vì sử dụng
columns_to_drop = ['PassengerId', 'SibSp',10, bạn nên sử dụng
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',12 với một số cột đã chọn
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
Ví dụ: nếu bạn chỉ muốn sử dụng các cột Tên, Giới tính, Tuổi và Người sống sót từ tập dữ liệu, bạn có thể tập hợp con tập dữ liệu gốc bằng cách sử dụng
columns_to_drop = ['PassengerId', 'SibSp',12 như được hiển thị bên dưới
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',6
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
Tập hợp con DataSet sử dụng danh sách các cột. Hình ảnh của tác giả
Tùy thuộc vào yêu cầu thực tế của nhiệm vụ của bạn là gì, bạn có thể sử dụng bất kỳ phương pháp nào ở trên để chỉ chọn các cột có liên quan
Trong hình trên, bạn có thể nhận thấy, một số giá trị từ các cột Tuổi và Sống sót bị thiếu. Và nó cần được giải quyết trước khi tiếp tục
Xử lý các giá trị hoặc NaN bị thiếuTrong hầu hết tất cả các tập dữ liệu, bạn cần xử lý các giá trị bị thiếu và đó là một trong những phần khó khăn trong quá trình làm sạch dữ liệu. Nếu bạn muốn sử dụng dữ liệu này cho máy học, bạn nên biết rằng, hầu hết các mô hình không chấp nhận dữ liệu bị thiếu
Nhưng làm thế nào để tìm thấy dữ liệu bị thiếu??
Có nhiều cách khác nhau để tìm ra các giá trị bị thiếu ở phần nào, cột nào trong tập dữ liệu. Dưới đây là bốn kỹ thuật thường được sử dụng để tìm ra dữ liệu bị thiếu
phương pháp. thông tin[]
Đây là một trong những cách đơn giản để hiểu nếu có thiếu giá trị trong bất kỳ cột nào. Khi bạn sử dụng
columns_to_drop = ['PassengerId', 'SibSp',14, bạn có thể xem tổng quan nhanh về DataFrame
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',15 như bên dưới
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
df. info[] để có cái nhìn tổng quan về DataFrame. Hình ảnh của tác giả
Các tên cột được hiển thị trong các hộp màu đỏ ở trên là tên một lần mà nhiều giá trị bị thiếu. Lý tưởng nhất là mỗi cột trong tập dữ liệu này phải chứa 1309 giá trị, nhưng kết quả này cho thấy hầu hết các cột chứa các giá trị nhỏ hơn 1309
Bạn cũng có thể hình dung những giá trị còn thiếu này
Bản đồ nhiệt của dữ liệu bị thiếu
Đây là một trong những cách phổ biến để trực quan hóa dữ liệu bị thiếu. Bạn có thể tạo bản đồ nhiệt của dữ liệu bằng cách mã hóa dữ liệu dưới dạng giá trị boolean i. e.
columns_to_drop = ['PassengerId', 'SibSp',16 hoặc
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',17 và bạn có thể sử dụng chức năng pandas
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',18 cho nó
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',18 trong gấu trúc là gì??
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
Phương thức
columns_to_drop = ['PassengerId', 'SibSp',60 trả về một đối tượng DataFrame trong đó tất cả các giá trị được thay thế bằng giá trị Boolean Đúng cho
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',61 và ngược lại là Sai
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
Tất cả những gì bạn cần làm là gõ chỉ một dòng mã như bên dưới
columns_to_drop = ['PassengerId', 'SibSp',5
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
Bản đồ nhiệt của các giá trị bị thiếu. Hình ảnh của tác giả
Trục X trong biểu đồ trên hiển thị tất cả các tên cột trong khi trục Y biểu thị chỉ mục hoặc số hàng. Chú giải ở phía bên phải cho bạn biết về các giá trị Boolean được sử dụng để biểu thị dữ liệu bị thiếu
Điều này hoàn toàn giúp bạn hiểu phần nào hoặc giữa các số chỉ mục mà dữ liệu bị thiếu trong một cột cụ thể
Chà, nếu tên cột không dễ đọc, bạn luôn có thể tạo phiên bản chuyển đổi của nó như bên dưới
columns_to_drop = ['PassengerId', 'SibSp',6
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
Bản đồ nhiệt của các giá trị bị thiếu. Hình ảnh của tác giả
Các bản đồ nhiệt như vậy rất hữu ích khi có số lượng tính năng hoặc cột nhỏ hơn. Nếu có một số lượng lớn các tính năng, bạn luôn có thể đặt nó
Tuy nhiên, hãy nhớ rằng việc trực quan hóa cần có thời gian để tạo nếu tập dữ liệu lớn
Mặc dù bản đồ nhiệt cung cấp cho bạn ý tưởng về vị trí của dữ liệu bị thiếu, nhưng nó không cho bạn biết về lượng dữ liệu bị thiếu. Và bạn có thể lấy nó bằng phương pháp tiếp theo
Thiếu dữ liệu theo tỷ lệ phần trăm của tổng số dữ liệu
Không có phương pháp đơn giản để lấy nó, nhưng tất cả những gì bạn có thể sử dụng là phương pháp
columns_to_drop = ['PassengerId', 'SibSp',18 và bên dưới một đoạn mã
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',8
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
Tỷ lệ phần trăm giá trị bị thiếu trong Pandas DataFrame. Hình ảnh của tác giả
Bằng cách này, bạn có thể thấy — có bao nhiêu phần trăm — các giá trị bị thiếu trong các cột riêng lẻ. Điều này có thể hữu ích khi xử lý các giá trị bị thiếu này
Tôi đã xác định được dữ liệu bị thiếu, nhưng điều gì tiếp theo??
Không có cách tiêu chuẩn để xử lý dữ liệu bị thiếu. Cách duy nhất là xem xét từng cột riêng lẻ, số lượng giá trị còn thiếu trong đó và tầm quan trọng của cột đó trong tương lai
Dựa trên các quan sát trên, bạn có thể sử dụng bất kỳ phương pháp nào trong số 3 phương pháp dưới đây để xử lý dữ liệu bị thiếu
- Xoá bản ghi — Xoá toàn bộ bản ghi tại một chỉ mục, khi một cột cụ thể có giá trị bị thiếu hoặc
columns_to_drop = ['PassengerId', 'SibSp',
63 tại đó. Xin lưu ý rằng kỹ thuật này có thể giảm đáng kể số lượng bản ghi trong tập dữ liệu nếu cột được đề cập có một số lượng lớn các giá trị bị thiếu
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[] - Bỏ cột hoặc tính năng — Điều này cần nghiên cứu kỹ về một cột cụ thể để hiểu tầm quan trọng của nó trong tương lai. Bạn chỉ có thể làm điều này khi bạn chắc chắn rằng tính năng này không cung cấp bất kỳ thông tin hữu ích nào, ví dụ: tính năng
columns_to_drop = ['PassengerId', 'SibSp',
6 trong bộ dữ liệu này
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[] - Giả định dữ liệu bị thiếu—Trong kỹ thuật này, bạn có thể thay thế các giá trị hoặc
columns_to_drop = ['PassengerId', 'SibSp',
61 bị thiếu bằng giá trị trung bình hoặc trung vị hoặc chế độ của cùng một cột
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
Tất cả những cách xử lý dữ liệu bị thiếu này là một chủ đề thảo luận hay mà tôi sẽ trình bày trong bài viết tiếp theo
Ngoài dữ liệu bị thiếu, một vấn đề phổ biến khác với dữ liệu là các loại dữ liệu không chính xác cần được giải quyết để có dữ liệu chất lượng tốt
Khi làm việc với các thư viện Python khác nhau, bạn có thể nhận thấy rằng cần có một kiểu dữ liệu cụ thể để thực hiện một chuyển đổi cụ thể. Do đó, kiểu dữ liệu của từng cột phải chính xác & phù hợp để sử dụng trong tương lai
Khi bạn sử dụng hàm
columns_to_drop = ['PassengerId', 'SibSp',66 hoặc bất kỳ hàm
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',67 nào khác trong pandas để lấy dữ liệu vào DataFrame, pandas sẽ cố gắng đoán loại dữ liệu của từng cột bằng cách quan sát các giá trị được lưu trữ trong đó
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
Điều này đoán nó gần như đúng cho tất cả các cột trừ một vài cột. Và bạn cần sửa kiểu dữ liệu của các cột đó theo cách thủ công
Ví dụ: trong tập dữ liệu Titanic, bạn có thể thấy các loại dữ liệu cột bằng cách sử dụng
columns_to_drop = ['PassengerId', 'SibSp',68 như bên dưới
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
Các loại dữ liệu không chính xác trong DataFrame của gấu trúc. Hình ảnh của tác giả
Trong đầu ra ở trên, các cột Tuổi và Sống sót có kiểu dữ liệu là
columns_to_drop = ['PassengerId', 'SibSp',69, tuy nhiên Tuổi phải luôn là số nguyên và Sống sót chỉ nên có hai loại giá trị — Có hoặc Không
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
Để hiểu rõ hơn, hãy xem 5 giá trị ngẫu nhiên trong các cột này
columns_to_drop = ['PassengerId', 'SibSp',5
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
Mẫu 5 hàng. Hình ảnh của tác giả
Ngoài các giá trị bị thiếu, cột tồn tại có hai giá trị —
columns_to_drop = ['PassengerId', 'SibSp',50 &
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',51 — lý tưởng nhất là
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',17 và
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',16 dưới dạng Boolean cho
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',54 và
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
columns_to_drop = ['PassengerId', 'SibSp',55, tương ứng. Ngoài ra, cột Tuổi chứa các giá trị ở định dạng thập phân
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
Trước khi tiếp tục, bạn có thể khắc phục sự cố này bằng cách sử dụng đúng loại cột. Tùy thuộc vào phiên bản gấu trúc của bạn, bạn có thể cần xử lý các giá trị còn thiếu trước khi sửa các loại dữ liệu
Cùng với các bước làm sạch dữ liệu ở trên, bạn cũng có thể cần một số cách làm sạch dữ liệu bên dưới tùy thuộc vào trường hợp sử dụng của bạn
- Thay thế các giá trị trong một cột — Đôi khi, các cột trong tập dữ liệu của bạn chứa các giá trị như Đúng — Sai, Có — Không. Có thể dễ dàng thay thế các giá trị này bằng
columns_to_drop = ['PassengerId', 'SibSp',
16 &
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]columns_to_drop = ['PassengerId', 'SibSp',
17 để tập dữ liệu có thể sử dụng được cho các ứng dụng máy học
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[] - Loại bỏ các giá trị ngoại lệ — Giá trị ngoại lệ là các điểm dữ liệu khác biệt đáng kể so với các quan sát khác. Tuy nhiên, không phải lúc nào cũng nên loại bỏ một ngoại lệ. Nó cần đánh giá cẩn thận các điểm dữ liệu khác nhau đáng kể này
- Loại bỏ trùng lặp — Bạn có thể coi dữ liệu là trùng lặp khi tất cả các giá trị trong tất cả các cột trong bản ghi đều giống nhau. Và pandas DataFrame method
columns_to_drop = ['PassengerId', 'SibSp',
58 khá tiện dụng để loại bỏ các bản sao
'Parch', 'WikiId',
'Name_wiki', 'Age_wiki']df.drop[columns_to_drop, inplace=True, axis=1]
df.head[]
Đó là tất cả
Tôi hy vọng bạn thấy bài viết này hữu ích và mới mẻ. Làm sạch dữ liệu là một trong những nhiệm vụ tốn nhiều thời gian nhất, thường cần những cách sáng tạo để giải quyết các loại sự cố dữ liệu khác nhau
Nếu bạn thích đọc những bài viết tuyệt vời như vậy, vui lòng đăng ký danh sách email của tôi
Là người dùng miễn phí, bạn chỉ có thể đọc 3 câu chuyện nhưng là thành viên Phương tiện, bạn có thể truy cập mọi thứ trên Phương tiện. Vì vậy, hãy tham gia Phương tiện bằng liên kết giới thiệu của tôi bên dưới, nó cũng sẽ hỗ trợ tôi với tư cách là một nhà văn vì Phương tiện chia sẻ một phần nhỏ phí của bạn với tôi. ✅