🔬 Bài 22: Làm chủ bảng dữ liệu với pandas
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.1. DataFrame — bảng dữ liệu có tên cột
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.
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)
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() và 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ấ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.
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
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.
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.shape | Xem 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ì?
2. Để lấy riêng cột "diem" từ DataFrame df, ta viết:
df["diem"].3. Biểu thức df["diem"] > 8 trả về thứ gì?
4. Để giữ lại các hàng có điểm > 8, ta viết:
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
🔌 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)
"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.