
Giải thích về Pandas GroupBy kèm ví dụ
Tìm hiểu cách sử dụng Pandas GroupBy để tóm tắt, so sánh và phân tích dữ liệu được nhóm bằng các ví dụ đơn giản, thực tế.
# Pandas GroupBy: Giải thích kèm ví dụ - KDnuggets
# Giới thiệu
Pandas là một trong những thư viện Python phổ biến nhất để phân tích dữ liệu. Thư viện này cung cấp các công cụ đơn giản để làm sạch, định hình lại, tóm tắt và khám phá dữ liệu có cấu trúc. Một trong những tính năng hữu ích nhất trong Pandas là GroupBy. Tính năng này giúp trả lời các câu hỏi yêu cầu nhóm các hàng theo một hoặc nhiều danh mục.
Ví dụ, nếu đang làm việc với dữ liệu bán hàng, người dùng có thể muốn tính tổng doanh thu theo khu vực, giá trị đơn hàng trung bình theo danh mục sản phẩm hoặc số lượng đơn hàng được xử lý bởi mỗi đại diện bán hàng. Thay vì lọc thủ công từng danh mục một, GroupBy cho phép thực hiện các phép tính này một cách rõ ràng và hiệu quả.
Trong hướng dẫn này, chúng tôi sẽ trình bày các ví dụ thực tế về việc sử dụng Pandas GroupBy với một tập dữ liệu bán hàng nhỏ. Chúng tôi đang sử dụng Deepnote làm môi trường mã hóa, vì vậy một số kết quả được hiển thị dưới dạng ảnh chụp màn hình sổ ghi chép trực tiếp bên dưới các khối mã.
# Tạo tập dữ liệu mẫu
Trước khi sử dụng GroupBy, chúng tôi tạo một tập dữ liệu bán lẻ nhỏ với các cột như order_id, region, category, sales_rep, units, unit_price, discount và order_date. Sau đó, chúng tôi chuyển đổi từ điển thành DataFrame của Pandas và tạo hai cột mới: gross_sales và net_sales.
data = {
"order_id": [101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112],
"region": ["North", "South", "North", "West", "South", "West", "North", "South", "West", "North", "South", "West"],
"category": ["Electronics", "Furniture", "Electronics", "Furniture", "Clothing", "Electronics",
"Clothing", "Furniture", "Clothing", "Furniture", "Electronics", "Clothing"],
"sales_rep": ["Ayesha", "Bilal", "Ayesha", "Chen", "Bilal", "Chen",
"Ayesha", "Bilal", "Chen", "Ayesha", "Bilal", "Chen"],
"units": [2, 1, 3, 2, 5, 4, 6, 2, 7, 1, 2, 8],
"unit_price": [500, 800, 450, 700, 60, 550, 55, 850, 65, 750, 520, 70],
"discount": [0.05, 0.10, 0.00, 0.08, 0.00, 0.12, 0.05, 0.10, 0.00, 0.07, 0.03, 0.00],
"order_date": pd.to_datetime([
"2026-01-05", "2026-01-06", "2026-01-08", "2026-01-10",
"2026-01-12", "2026-01-15", "2026-02-02", "2026-02-05",
"2026-02-08", "2026-02-12", "2026-02-15", "2026-02-20"
])
}
df = pd.DataFrame(data)
df["gross_sales"] = df["units"] * df["unit_price"]
df["net_sales"] = df["gross_sales"] * (1 - df["discount"])
df
Cột gross_sales được tính bằng cách nhân units với unit_price, trong khi net_sales điều chỉnh giá trị đó sau khi áp dụng discount. Điều này cung cấp một tập dữ liệu rõ ràng có thể được sử dụng cho tất cả các ví dụ về GroupBy.
# Sử dụng cú pháp GroupBy cơ bản
Thao tác GroupBy cơ bản nhất tuân theo một mẫu đơn giản: chọn cột nhóm, chọn cột giá trị và áp dụng hàm tổng hợp. Trong ví dụ này, chúng ta nhóm dữ liệu theo khu vực và tính tổng doanh số thuần (net_sales) cho từng khu vực.
df.groupby("region")["net_sales"].sum()
Kết quả cho thấy các khu vực North, South và West đều có giá trị tổng doanh số riêng. Đây là trường hợp sử dụng GroupBy đơn giản và phổ biến nhất khi tóm tắt dữ liệu.
region
North 3311.0
South 3558.8
West 4239.0
Name: net_sales, dtype: float64
# Sử dụng GroupBy với as_index=False
Theo mặc định, pandas sử dụng cột được nhóm làm chỉ mục trong đầu ra. Mặc dù điều này hữu ích trong một số trường hợp, nhưng thường dễ làm việc hơn với một DataFrame thông thường, trong đó cột được nhóm vẫn là một cột bình thường. Đó là lúc as_index=False trở nên hữu ích.
df.groupby("region", as_index=False)["net_sales"].sum()
Trong ví dụ này, chúng ta lại tính tổng doanh số thuần theo khu vực, nhưng kết quả được trả về dưới dạng một DataFrame rõ ràng, dễ dàng xuất, hợp nhất hoặc sử dụng trong các báo cáo hơn.
# Áp dụng nhiều phép tổng hợp trên một cột
GroupBy không giới hạn ở một phép tính duy nhất. Bạn có thể áp dụng nhiều hàm tổng hợp cho cùng một cột bằng cách sử dụng agg().
Trong ví dụ này, chúng ta tính tổng, trung bình, tối thiểu, tối đa và số lượng net_sales cho từng khu vực.
Điều này cung cấp cho chúng ta một bản tóm tắt thống kê nhanh về hiệu suất bán hàng theo khu vực và giúp chúng ta so sánh không chỉ tổng doanh thu mà còn cả quy mô đơn hàng trung bình và khối lượng đơn hàng.
df.groupby("region")["net_sales"].agg(["sum", "mean", "min", "max", "count"])
# Sử dụng các phép tổng hợp được đặt tên
Các phép tổng hợp được đặt tên giúp đầu ra của GroupBy dễ đọc và sử dụng hơn. Thay vì trả về các tên cột chung như sum hoặc mean, chúng ta định nghĩa các tên riêng như total_sales, average_order_value, total_units và number_of_orders.
Điều này đặc biệt hữu ích khi chuẩn bị phân tích cho bảng điều khiển, báo cáo hoặc hướng dẫn vì tên cột đầu ra giải thích rõ ràng ý nghĩa của từng chỉ số.
region_summary = (
df.groupby("region", as_index=False)
.agg(
total_sales=("net_sales", "sum"),
average_order_value=("net_sales", "mean"),
total_units=("units", "sum"),
number_of_orders=("order_id", "count")
)
)
region_summary
# Nhóm theo nhiều cột
Bạn cũng có thể nhóm dữ liệu theo nhiều hơn một cột. Trong ví dụ này, chúng ta nhóm theo cả khu vực và danh mục để tính tổng doanh số thuần cho từng danh mục sản phẩm trong mỗi khu vực.
Điều này cung cấp cho chúng ta một cái nhìn chi tiết hơn về dữ liệu so với việc chỉ nhóm theo khu vực. Nhóm nhiều cột hữu ích khi bạn muốn phân tích hiệu suất trên các yếu tố khác nhau.
Nguồn tin: KDnuggets — Tác giả: Abid Ali Awan. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.