
Python Pandas Cho Người Làm Data: Từ DataFrame Đến Báo Cáo Tự Động
Chia sẻ
"Hướng dẫn Python Pandas dành cho dân Data: đọc/ghi Excel và CSV, làm sạch dữ liệu, groupby, merge, pivot_table, và tạo biểu đồ. Bao gồm ví dụ thực tế với dữ liệu bán hàng Việt Nam."
Nếu Excel là "con dao Thụy Sĩ" của dân văn phòng, thì Python Pandas là "cỗ máy công nghiệp" cho xử lý dữ liệu. Pandas xử lý hàng triệu dòng mà không lag, tự động hóa mọi thao tác lặp, và tích hợp với hệ sinh thái visualization/ML khổng lồ của Python.
Bài viết này hướng dẫn bạn Pandas từ zero — dành cho người đã quen Excel muốn "level up" sang Python. Mọi ví dụ đều dùng dữ liệu bán hàng thực tế, giải thích bằng tiếng Việt.

1. Cài Đặt Và Import Pandas
Pandas là thư viện mã nguồn mở, cài qua pip hoặc conda. Nếu dùng Google Colab hay Jupyter Notebook thì Pandas đã có sẵn.
# Cài đặt
pip install pandas openpyxl matplotlib
# openpyxl: engine đọc/ghi file .xlsx
# matplotlib: thư viện vẽ biểu đồimport pandas as pd
import matplotlib.pyplot as plt
# Kiểm tra phiên bản
print(pd.__version__) # 2.2.x trở lên💡 Quy ước: import pandas as pd — tất cả tài liệu, tutorial, StackOverflow đều dùng "pd" làm alias.
2. DataFrame — Cấu Trúc Dữ Liệu Cốt Lõi
DataFrame giống như 1 bảng Excel: có dòng (index), cột (columns), và dữ liệu ở các ô. Khác biệt: mỗi cột là 1 Series (mảng 1 chiều) và có kiểu dữ liệu rõ ràng.
2.1 Tạo DataFrame từ dictionary
# Tạo DataFrame thủ công
df = pd.DataFrame({
"MaDH": ["DH001", "DH002", "DH003", "DH004", "DH005"],
"KhachHang": ["Nguyễn Văn An", "Trần Thị Bình", "Lê Hoàng Cường", "Phạm Minh Đức", "Nguyễn Văn An"],
"SanPham": ["Laptop", "Chuột", "Bàn phím", "Laptop", "Màn hình"],
"SoLuong": [2, 10, 5, 1, 3],
"DonGia": [25000000, 350000, 1200000, 28000000, 8500000],
"NgayBan": pd.to_datetime(["2026-01-15", "2026-01-16", "2026-01-16", "2026-02-01", "2026-02-03"])
})
print(df)
print(df.info()) # Kiểu dữ liệu, null count
print(df.describe()) # Thống kê cơ bản2.2 Đọc/ghi file Excel và CSV
# Đọc file Excel
df = pd.read_excel("BaoCao_BanHang.xlsx", sheet_name="Data")
# Đọc file CSV
df = pd.read_csv("doanh_thu.csv", encoding="utf-8-sig") # utf-8-sig cho tiếng Việt
# Ghi ra Excel
df.to_excel("ket_qua.xlsx", index=False, sheet_name="KetQua")
# Ghi ra CSV
df.to_csv("ket_qua.csv", index=False, encoding="utf-8-sig")3. Làm Sạch Dữ Liệu (Data Cleaning)
80% thời gian Data Analyst dành cho cleaning — và Pandas sinh ra để làm việc này nhanh gấp 10 lần Excel.
3.1 Xử lý giá trị thiếu (missing values)
# Kiểm tra missing values
print(df.isnull().sum()) # Đếm null mỗi cột
# Xóa dòng có bất kỳ null nào
df_clean = df.dropna()
# Xóa dòng null ở cột cụ thể
df_clean = df.dropna(subset=["DonGia", "SoLuong"])
# Điền giá trị thay thế
df["DonGia"] = df["DonGia"].fillna(0)
df["KhuVuc"] = df["KhuVuc"].fillna("Chưa xác định")
# Forward fill — điền bằng giá trị dòng trước
df["KhuVuc"] = df["KhuVuc"].ffill()3.2 Đổi kiểu dữ liệu
# Đổi kiểu dữ liệu
df["SoLuong"] = df["SoLuong"].astype(int)
df["DonGia"] = pd.to_numeric(df["DonGia"], errors="coerce") # "coerce" → NaN nếu lỗi
df["NgayBan"] = pd.to_datetime(df["NgayBan"], format="%d/%m/%Y")
# Tách ngày tháng
df["Nam"] = df["NgayBan"].dt.year
df["Thang"] = df["NgayBan"].dt.month
df["TuanTrongNam"] = df["NgayBan"].dt.isocalendar().week3.3 Xóa trùng lặp và format text
# Xóa dòng trùng lặp
df = df.drop_duplicates()
# Xóa trùng theo cột cụ thể (giữ dòng đầu tiên)
df = df.drop_duplicates(subset=["MaDH"], keep="first")
# Chuẩn hóa text
df["KhachHang"] = df["KhachHang"].str.strip() # Xóa khoảng trắng đầu/cuối
df["KhachHang"] = df["KhachHang"].str.title() # Viết Hoa Chữ Cái Đầu
df["MaSP"] = df["MaSP"].str.upper() # IN HOA
df["DiaChi"] = df["DiaChi"].str.replace(" ", " ") # Xóa khoảng trắng kép4. Lọc, Sắp Xếp Và Thêm Cột Tính Toán
4.1 Lọc dữ liệu (Filtering)
# Lọc đơn giản
df_hn = df[df["KhuVuc"] == "Hà Nội"]
# Nhiều điều kiện (AND)
df_vip = df[(df["DoanhThu"] > 50000000) & (df["KhuVuc"] == "HCM")]
# OR
df_2cities = df[df["KhuVuc"].isin(["Hà Nội", "Đà Nẵng"])]
# Lọc theo chuỗi
df_laptop = df[df["SanPham"].str.contains("Laptop", case=False, na=False)]4.2 Sắp xếp
# Sắp xếp giảm dần theo doanh thu
df_sorted = df.sort_values("DoanhThu", ascending=False)
# Sắp xếp theo nhiều cột
df_sorted = df.sort_values(["KhuVuc", "DoanhThu"], ascending=[True, False])4.3 Thêm cột tính toán
# Cột mới
df["ThanhTien"] = df["SoLuong"] * df["DonGia"]
df["LoiNhuan"] = df["ThanhTien"] - df["GiaVon"]
df["TyLeLoi"] = (df["LoiNhuan"] / df["ThanhTien"] * 100).round(1)
# Cột điều kiện (giống IF trong Excel)
df["PhanLoai"] = df["ThanhTien"].apply(
lambda x: "VIP" if x > 50000000 else ("Trung bình" if x > 10000000 else "Nhỏ")
)
# Dùng np.where (nhanh hơn apply)
import numpy as np
df["PhanLoai"] = np.where(df["ThanhTien"] > 50000000, "VIP", "Thường")5. GroupBy — Tổng Hợp Dữ Liệu (Giống Pivot Table)
GroupBy là tính năng "nhóm và tổng hợp" — tương đương SUMIF/Pivot Table trong Excel nhưng linh hoạt hơn nhiều.
5.1 Cơ bản
# Tổng doanh thu theo khu vực
df.groupby("KhuVuc")["DoanhThu"].sum()
# Nhiều phép tính
df.groupby("KhuVuc")["DoanhThu"].agg(["sum", "mean", "count"])
# Nhiều cột group
df.groupby(["KhuVuc", "Thang"])["DoanhThu"].sum()5.2 Nâng cao
# Nhiều cột với nhiều phép tính khác nhau
result = df.groupby("KhuVuc").agg(
TongDoanhThu=("DoanhThu", "sum"),
TrungBinh=("DoanhThu", "mean"),
SoDonHang=("MaDH", "nunique"),
DoanhThuMax=("DoanhThu", "max")
).reset_index()
print(result)
# % Contribution
result["TyTrong"] = (result["TongDoanhThu"] / result["TongDoanhThu"].sum() * 100).round(1)6. Merge — Gộp Bảng (Giống VLOOKUP/JOIN)
Merge trong Pandas giống JOIN trong SQL — gộp 2 DataFrame dựa trên cột chung.
# Bảng đơn hàng
orders = pd.DataFrame({
"MaDH": ["DH001", "DH002", "DH003"],
"MaSP": ["SP01", "SP02", "SP01"],
"SoLuong": [5, 3, 2]
})
# Bảng sản phẩm
products = pd.DataFrame({
"MaSP": ["SP01", "SP02", "SP03"],
"TenSP": ["Laptop Dell", "Chuột Logitech", "Bàn phím Corsair"],
"DonGia": [25000000, 450000, 1800000]
})
# LEFT JOIN — giữ tất cả đơn hàng, thêm thông tin sản phẩm
df_merged = orders.merge(products, on="MaSP", how="left")
df_merged["ThanhTien"] = df_merged["SoLuong"] * df_merged["DonGia"]
print(df_merged)how="left": giữ tất cả bên trái (giống LEFT JOIN SQL hoặc VLOOKUP)
how="inner": chỉ giữ dòng match cả 2 bên
how="outer": giữ tất cả, NaN cho dòng không match
how="right": giữ tất cả bên phải
7. Pivot Table Và Visualization
7.1 Pivot Table
# Pivot Table — giống Excel Pivot
pivot = pd.pivot_table(
df,
values="DoanhThu",
index="KhuVuc",
columns="Thang",
aggfunc="sum",
fill_value=0,
margins=True, # Thêm dòng/cột tổng
margins_name="Tổng"
)
print(pivot)7.2 Biểu đồ cơ bản
# Biểu đồ cột — Doanh thu theo khu vực
df_region = df.groupby("KhuVuc")["DoanhThu"].sum().sort_values(ascending=False)
plt.figure(figsize=(10, 6))
df_region.plot(kind="bar", color=["#2563eb", "#7c3aed", "#059669", "#dc2626"])
plt.title("Doanh Thu Theo Khu Vực", fontsize=14, fontweight="bold")
plt.ylabel("Doanh Thu (VNĐ)")
plt.xlabel("")
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig("doanhthu_khuvuc.png", dpi=150) # Lưu ảnh
plt.show()7.3 Biểu đồ đường — Trend theo tháng
# Line chart — doanh thu theo tháng
df_monthly = df.groupby("Thang")["DoanhThu"].sum()
plt.figure(figsize=(10, 5))
plt.plot(df_monthly.index, df_monthly.values, marker="o", linewidth=2, color="#2563eb")
plt.fill_between(df_monthly.index, df_monthly.values, alpha=0.1, color="#2563eb")
plt.title("Trend Doanh Thu Theo Tháng", fontsize=14, fontweight="bold")
plt.ylabel("Doanh Thu (VNĐ)")
plt.xlabel("Tháng")
plt.grid(axis="y", alpha=0.3)
plt.tight_layout()
plt.show()8. Ví Dụ Thực Tế: Báo Cáo Bán Hàng Tự Động
Scenario: Mỗi tuần bạn nhận file CSV doanh thu, cần tạo báo cáo Excel có Pivot Table + biểu đồ. Dùng Pandas để tự động hóa toàn bộ.
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime
# 1. Đọc dữ liệu
df = pd.read_csv("doanhthu_tuan.csv", encoding="utf-8-sig")
df["NgayBan"] = pd.to_datetime(df["NgayBan"])
# 2. Cleaning
df = df.dropna(subset=["MaDH", "DoanhThu"])
df["DoanhThu"] = pd.to_numeric(df["DoanhThu"], errors="coerce").fillna(0)
# 3. Phân tích
by_region = df.groupby("KhuVuc").agg(
TongDT=("DoanhThu", "sum"),
SoDon=("MaDH", "count"),
DTTrungBinh=("DoanhThu", "mean")
).round(0)
by_product = df.groupby("NhomSP")["DoanhThu"].sum().sort_values(ascending=False).head(10)
# 4. Xuất ra Excel (nhiều sheet)
with pd.ExcelWriter(f"BaoCao_{datetime.now():%Y%m%d}.xlsx", engine="openpyxl") as writer:
df.to_excel(writer, sheet_name="RawData", index=False)
by_region.to_excel(writer, sheet_name="TheoKhuVuc")
by_product.to_excel(writer, sheet_name="Top10SanPham")
print("✅ Báo cáo đã xuất xong!")
# 5. Biểu đồ
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
by_region["TongDT"].plot(kind="barh", ax=axes[0], color="#2563eb")
axes[0].set_title("Doanh Thu Theo Khu Vực")
by_product.head(5).plot(kind="pie", ax=axes[1], autopct="%1.1f%%")
axes[1].set_title("Top 5 Sản Phẩm")
axes[1].set_ylabel("")
plt.tight_layout()
plt.savefig("bao_cao_chart.png", dpi=150)
print("✅ Biểu đồ đã lưu!")Câu Hỏi Thường Gặp (FAQ)
Nên học Pandas hay tiếp tục dùng Excel?
Không phải chọn 1 trong 2 — hãy dùng cả 2. Excel phù hợp cho phân tích ad-hoc nhanh, chia sẻ với team không biết code, và trình bày dashboard đơn giản. Pandas phù hợp khi dữ liệu lớn (trên 100K dòng), cần tự động hóa báo cáo lặp lại, hoặc cần xử lý phức tạp mà Excel không làm được.
Cần biết Python bao nhiêu để học Pandas?
Chỉ cần biết cơ bản: biến, list, dictionary, vòng lặp for, hàm def, và if/else. Khoảng 1-2 tuần học Python cơ bản là đủ để bắt đầu Pandas. Quan trọng nhất là tư duy xử lý dữ liệu — nếu bạn đã quen Excel, sẽ tiếp thu Pandas rất nhanh.
Google Colab hay Jupyter Notebook — nên dùng cái nào?
Google Colab nếu bạn muốn bắt đầu ngay (không cần cài đặt gì), chia sẻ dễ dàng, và có GPU miễn phí cho ML. Jupyter Notebook (cài local) nếu bạn cần xử lý file lớn, bảo mật dữ liệu, hoặc đã có Python environment sẵn.
Pandas có thay thế Power Query không?
Pandas mạnh hơn Power Query ở khả năng tùy biến, xử lý dữ liệu phi cấu trúc, và tích hợp ML. Nhưng PQ dễ dùng hơn cho người không biết code, tích hợp sẵn Excel, và đủ cho 90% nhu cầu ETL của dân kế toán/tài chính. Lý tưởng: dùng PQ cho daily workflow, Pandas cho dự án phức tạp.
Kết Luận
Python Pandas là "superpower" cho Data Analyst. Chỉ cần nắm vững 6 kỹ năng cốt lõi: đọc/ghi file, cleaning, filtering, groupby, merge, và visualization — bạn đã đủ khả năng tự động hóa hầu hết báo cáo hàng tuần.
Bắt đầu từ Google Colab — copy đoạn code trong bài này và chạy thử. Đọc thêm bài SQL Nâng Cao và Power Query trên Trà Đá Data nhé! 🍵
Bình luận
Đăng nhập để tham gia bình luận
Đăng nhậpNhận bài viết mới nhất
Đăng ký để nhận thông báo khi có bài viết mới. Không spam, chỉ kiến thức chất lượng.
Bài viết liên quan
Khám phá thêm các bài viết cùng chủ đề
