Tin học - Bài 22: Làm chủ bảng dữ liệu với pandas (Khoa học Dữ liệu & ML)

🔬 Bài 22: Làm chủ bảng dữ liệu với pandas

🎯 Sau bài này bạn sẽ: tạo được một DataFrame, lấy một cột (Series), lọc hàng theo điều kiện, và tính mean(), max(), groupby() — ngay trên trình duyệt.

DataFrame = một BẢNG dữ liệu ten lop diem tuoi 0 1 2 index An6A8.511 Binh6A7.012 Chi6B9.211 df["diem"] = một cột (Series) df.loc[1] = một hàng (bạn Binh)
Một DataFrame gồm các cột có tên và chỉ số hàng (index).

1. DataFrame — bảng dữ liệu có tên cột

🟢 Lớp A · Trực giác

Hãy tưởng tượng một bảng điểm Excel: mỗi cột có tên (ten, lớp, điểm), mỗi hàng là một bạn. Đó chính là một DataFrame. numpy cho ta một khối số không tên; pandas cho ta bảng có tên cột nên dễ đọc hơn nhiều.

🔵 Lớp B · Cơ chế

Trong bộ nhớ, mỗi cột là một Series (một mảng numpy kèm nhãn index). DataFrame là tập các Series dùng chung một index. Vì dựa trên numpy nên phép tính trên cả cột vẫn vector-hóa (nhanh).

import pandas as pd
df = pd.DataFrame({
    "ten": ["An", "Binh", "Chi"],
    "diem": [8.5, 7.0, 9.2]
})
print(df)
🟣 Lớp C · Nghiên cứu

Trong nghiên cứu, dữ liệu thô thường đến dưới dạng file CSV. Bạn sẽ dùng pd.read_csv(...) để nạp, rồi luôn kiểm tra df.shape, df.head()df.dtypes — "biết dữ liệu của mình" là bước đầu tiên của mọi phân tích trung thực.

2. Lấy cột và lọc hàng

🟢 Lớp A · Trực giác

Lấy một cột: viết df["diem"] giống như chỉ tay vào đầu cột "điểm" trong bảng. Lọc hàng: muốn giữ các bạn điểm > 8, ta viết điều kiện rồi pandas tự bỏ các hàng không thỏa.

Lọc: df[df["diem"] > 8] diem 8.5 7.0 9.2 > 8 ? True False True giữ lại 8.5 9.2 Điều kiện biến cột thành dãy True/False, rồi pandas chỉ giữ các hàng True.
Lọc dữ liệu = tạo "mặt nạ True/False" rồi giữ lại hàng thỏa điều kiện.
🔵 Lớp B · Cơ chế

df["diem"] > 8 trả về một Series toàn True/False (gọi là boolean mask). Khi ta đưa mask đó vào df[...], pandas chỉ giữ lại các hàng ứng với True. Cơ chế này chính là lọc vector-hóa của numpy ở Bài 21.

# lay mot cot
print(df["diem"])
# loc: giu ban co diem > 8
gioi = df[df["diem"] > 8]
print(gioi)

3. Thống kê và nhóm dữ liệu

🟢 Lớp A · Trực giác

pandas tính giúp bạn các con số tổng kết: điểm trung bình (.mean()), cao nhất (.max()), đếm số lượng (.count()). Muốn so sánh giữa các lớp, dùng groupby("lop") — như chia bảng thành các nhóm rồi tính riêng từng nhóm.

🟣 Lớp C · Nghiên cứu

groupby theo mô hình split → apply → combine: tách dữ liệu theo nhóm, tính thống kê mỗi nhóm, rồi gộp kết quả. Đây là công cụ cốt lõi khi so sánh nhóm điều trị vs nhóm đối chứng trong một thí nghiệm.

print(df["diem"].mean())
print(df.groupby("lop")["diem"].mean())

4. Bảng ghi nhớ: cú pháp pandas thường dùng

ViếtÝ nghĩa
pd.DataFrame({...})Tạo bảng từ dict các cột
df["diem"]Lấy một cột (một Series)
df[df["diem"] > 8]Lọc: giữ các hàng thỏa điều kiện
df["diem"].mean()Trung bình của cột
df.groupby("lop")Chia bảng theo nhóm để thống kê riêng
df.head() · df.shapeXem vài hàng đầu · số (hàng, cột)

✎ Kiểm tra nhanh (5 câu)

1. Đối tượng chính của pandas để chứa một bảng dữ liệu (nhiều cột có tên) là gì?

Series là một cột; nhiều cột có tên gộp lại thành DataFrame — chính là cái bảng.

2. Để lấy riêng cột "diem" từ DataFrame df, ta viết:

Dùng dấu ngoặc vuông và tên cột trong chuỗi: df["diem"].

3. Biểu thức df["diem"] > 8 trả về thứ gì?

Đó là boolean mask: mỗi hàng được so sánh, cho ra True hoặc False.

4. Để giữ lại các hàng có điểm > 8, ta viết:

Đưa boolean mask vào trong df[...]: df[df["diem"] > 8].

5. Muốn tính điểm trung bình riêng cho từng lớp, ta dùng:

groupby("lop") chia theo lớp, rồi ["diem"].mean() tính trung bình mỗi nhóm.

💻 Thực hành: chạy pandas thật

🔬 Phòng thí nghiệm pandas. Bấm ▶ Khởi động Python để nạp pandas (lần đầu mất vài giây), sau đó bấm ▶ Chạy. Thử sửa dữ liệu, thêm bạn mới, hoặc đổi điều kiện lọc.

🔌 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)
💡 Thử thách: Thêm cột "tuoi" vào DataFrame, rồi in ra tuổi trung bình của mỗi lớp bằng groupby. Gợi ý: thêm khóa "tuoi": [...] vào dict.