Bài 18. Phân tích dữ liệu với pandas

pandas là thư viện phân tích dữ liệu số một của Python. Bài này dạy đọc dữ liệu, lọc, nhóm, tổng hợp, làm sạch và vẽ biểu đồ, thay thế nhiều thao tác Excel lặp đi lặp lại.

60 phútTrung cấp
Bạn sẽ học được
  • Hiểu Series và DataFrame
  • Đọc CSV/Excel, xem nhanh dữ liệu
  • Lọc, sắp xếp, tạo cột, groupby
  • Làm sạch dữ liệu và vẽ biểu đồ
Thuật ngữ cần biết
DataFrame
Bảng dữ liệu hai chiều có tên cột.
Series
Một cột dữ liệu có chỉ mục.
groupby
Nhóm theo cột rồi tổng hợp (như PivotTable).
NaN
Giá trị bị thiếu.

Khái niệm và lý thuyết

DataFrame giống một trang tính: mỗi cột một kiểu dữ liệu, mỗi dòng một bản ghi. Khác Excel, mọi bước xử lý được ghi lại thành mã: lần sau chỉ cần chạy lại khi có dữ liệu mới. pandas thao tác theo cột (vector hóa), nhanh hơn nhiều so với vòng for duyệt từng dòng.

pandas 3.x dùng kiểu chuỗi mới và cơ chế copy-on-write mặc định, giúp tránh cảnh báo SettingWithCopy quen thuộc ở các phiên bản trước. Với dữ liệu rất lớn có thể tìm hiểu thêm Polars.

Đọc và xem dữ liệu

uv add pandas openpyxl matplotlib
import pandas as pd
df = pd.read_csv("diem.csv")             # hoặc pd.read_excel("diem.xlsx")
df.head()          # 5 dòng đầu
df.info()          # kiểu dữ liệu, số giá trị thiếu
df.describe()      # thống kê: trung bình, min, max...

Lọc, sắp xếp, cột mới

gioi = df[df["diem"] >= 8.5]
k66 = df.query("lop == 'K66 Tin' and diem >= 5")
df["xep_loai"] = pd.cut(df["diem"], bins=[0, 5, 7, 8.5, 10],
                        labels=["Yếu", "TB", "Khá", "Giỏi"], right=False, include_lowest=True)
df = df.sort_values(["lop", "diem"], ascending=[True, False])

Nhóm và tổng hợp

bang = df.groupby("lop").agg(si_so=("ma", "count"),
                             diem_tb=("diem", "mean"),
                             cao_nhat=("diem", "max")).round(2)
pivot = df.pivot_table(index="lop", columns="xep_loai", values="ma",
                       aggfunc="count", fill_value=0, observed=False)
bang.to_excel("tong_hop.xlsx")

Làm sạch dữ liệu

df["ho_ten"] = df["ho_ten"].str.strip().str.title()
df = df.drop_duplicates(subset="ma")
df["diem"] = pd.to_numeric(df["diem"], errors="coerce")  # chữ -> NaN
df["diem"] = df["diem"].fillna(0)
df["ngay_sinh"] = pd.to_datetime(df["ngay_sinh"], dayfirst=True)

Biểu đồ

import matplotlib.pyplot as plt
bang["diem_tb"].plot(kind="bar", title="Điểm trung bình theo lớp")
plt.tight_layout(); plt.savefig("bieu_do.png", dpi=150)
Mẹo hay

Dùng Jupyter Notebook (hoặc notebook trong VS Code, Google Colab) để xem kết quả từng bước khi phân tích dữ liệu.

Lưu ý

Tránh duyệt DataFrame bằng vòng for với iterrows: chậm hàng trăm lần. Hãy dùng phép toán trên cả cột.

Thực hành
  1. Đọc tệp điểm, tìm 10 sinh viên điểm cao nhất mỗi lớp.
  2. Tạo bảng tổng hợp số lượng theo xếp loại cho từng lớp.
  3. Làm sạch tệp có tên thừa khoảng trắng, mã trùng, điểm ghi “vắng”.
  4. Vẽ biểu đồ cột và biểu đồ tròn tỉ lệ xếp loại, lưu PNG.
Tóm tắt bài học
  • DataFrame là bảng, Series là cột.
  • Lọc bằng điều kiện hoặc query; tạo cột bằng phép toán vector.
  • groupby/pivot_table thay PivotTable.
  • Làm sạch trước, phân tích sau; vẽ bằng matplotlib.