🔬 Bài 23: Làm sạch dữ liệu — bước không ai được bỏ qua
isna(), xử lý bằng dropna() hoặc fillna(), đổi kiểu với astype(), và bỏ trùng bằng drop_duplicates() — ngay trên trình duyệt.1. Ô thiếu (NaN) — phát hiện trước đã
Trong bảng, ô thiếu là những chỗ bị bỏ trống — pandas gọi chúng là NaN (Not a Number). Nếu bạn cứ tính trung bình khi còn ô trống, kết quả có thể sai. Vì vậy việc đầu tiên là đếm xem thiếu bao nhiêu.
df.isna() trả về bảng True/False (True = ô thiếu). Cộng dồn lại bằng df.isna().sum() cho ta số ô thiếu mỗi cột. Đây cũng là vector-hóa: pandas kiểm tra cả bảng cùng lúc.
# dem so o thieu moi cot print(df.isna().sum())
Không phải ô thiếu nào cũng giống nhau: thiếu ngẫu nhiên hay thiếu có hệ thống (ví dụ: cảm biến hỏng luôn thiếu ở nhiệt độ cao)? Cách bạn xử lý có thể đưa thêm thiên lệch (bias) vào dữ liệu, nên luôn ghi lại mình đã làm gì.
2. Bỏ hoặc điền ô thiếu
dropna bỏ hàng thiếu; fillna điền giá trị thay thế. Mỗi cách có cái giá của nó.Hai lựa chọn chính: bỏ những hàng thiếu (dropna) — gọn gàng nhưng mất dữ liệu; hoặc điền giá trị thay thế (fillna), thường là trung bình hoặc giá trị hay gặp nhất — giữ được số hàng nhưng là "đoán".
# cach 1: bo hang co o thieu sach = df.dropna() # cach 2: dien bang diem trung binh tb = df["diem"].mean() df["diem"] = df["diem"].fillna(tb)
fillna không sửa bảng gốc trừ khi bạn gán lại (df["diem"] = ...) hoặc dùng inplace=True. Nhiều lỗi "sửa mà không thấy đổi" là do quên gán lại kết quả.
3. Sai kiểu và hàng trùng
Đôi khi số bị lưu thành chữ (ví dụ "11" thay vì 11) nên không tính toán được — ta dùng astype để đổi về số. Còn khi có hàng bị lặp lại y hệt, drop_duplicates giữ lại một bản.
Hàng trùng rất nguy hiểm: nếu một mẫu bị lặp, mô hình sẽ "học thuộc" mẫu đó nhiều hơn, làm sai kết quả đánh giá. Đây là một dạng rò rỉ dữ liệu ta sẽ học kỹ ở Chặng 8.
# doi cot tuoi ve so nguyen df["tuoi"] = df["tuoi"].astype(int) # bo hang trung lap df = df.drop_duplicates()
4. Bảng ghi nhớ: công cụ làm sạch
| Viết | Ý nghĩa |
|---|---|
df.isna().sum() | Đếm số ô thiếu mỗi cột |
df.dropna() | Bỏ các hàng có ô thiếu |
df["c"].fillna(x) | Điền ô thiếu bằng giá trị x |
df["c"].astype(int) | Đổi kiểu dữ liệu của cột |
df.drop_duplicates() | Bỏ các hàng trùng lặp |
df.dtypes | Xem kiểu dữ liệu từng cột |
✎ Kiểm tra nhanh (5 câu)
1. Trong pandas, một ô bị bỏ trống (thiếu dữ liệu) thường hiển là:
NaN = Not a Number, ký hiệu ô thiếu. Lưu ý NaN khác với số 0.2. Để đếm xem mỗi cột thiếu bao nhiêu ô, ta dùng:
isna() cho bảng True/False, sum() cộng True (=1) theo từng cột.3. Viết df.dropna() sẽ làm gì?
dropna = drop N/A: loại bỏ hàng có giá trị thiếu.4. Cột "tuoi" đang lưu dưới dạng chữ (ví dụ "11"). Để đổi về số nguyên, ta viết:
astype(int) đổi kiểu của cả cột về số nguyên.5. Có hai hàng giống hệt nhau trong bảng. Cách gọn gàng nhất để chỉ giữ lại một bản là:
drop_duplicates() bỏ hàng trùng, giữ lại bản đầu tiên.💻 Thực hành: làm sạch dữ liệu thật
🔌 Python chưa khởi động. Bấm "Khởi động Python" để bắt đầu.
(kết quả sẽ hiện ở đây sau khi chạy)
fillna(mean), hãy thử dropna() và xem bảng còn lại mấy hàng. Bạn thích cách nào hơn cho bộ dữ liệu nhỏ này?