Courses
Dữ liệu dạng rộng (wide) dễ đọc, nhưng nhiều tác vụ phân tích và trực quan hóa hoạt động hiệu quả hơn với dữ liệu ở dạng dài (long).
Hàm pandas.melt() tái cấu trúc một DataFrame bằng cách chuyển một hoặc nhiều cột thành các hàng, đồng thời giữ nguyên các cột định danh đã chọn. Điều này giúp dữ liệu của bạn dễ lọc, nhóm, trực quan hóa và phân tích hơn.
Trong hướng dẫn này, tôi sẽ chỉ cho bạn cách sử dụng hàm pandas.melt(). Tôi cũng sẽ so sánh nó với các lựa chọn như pivot(), stack() và wide_to_long(). Nếu bạn mới bắt đầu với Python, tôi khuyên bạn nên học khóa Giới thiệu về Python của chúng tôi, bao gồm các kỹ năng như kiểu dữ liệu, danh sách, hàm cơ bản và gói thư viện.
Cách sử dụng pandas.melt()
Hàm pandas.melt() chuyển đổi DataFrame từ dạng rộng sang dạng dài bằng cách biến tiêu đề cột thành các giá trị trong một cột mới.
Cú pháp như sau:
pandas.melt(
frame,
id_vars=None,
value_vars=None,
var_name=None,
value_name="value",
col_level=None,
ignore_index=True
)
Trong đó:
-
frame: DataFrame cần tái cấu trúc. Chỉ bắt buộc khi dùngpandas.melt(). -
id_vars: Cột hoặc danh sách cột cần giữ nguyên. Các cột này định danh mỗi hàng sau khi tái cấu trúc. -
value_vars: Cột hoặc danh sách cột cần “unpivot”. Nếu bỏ qua, pandas sẽ melt tất cả các cột không có trongid_vars. -
var_name: Tên cột mới lưu các tên cột gốc. Mặc định là”variable”nếu không chỉ định. -
value_name: Tên cột mới lưu các giá trị. Mặc định là”value”nếu không chỉ định. -
col_level: Tùy chọn, chỉ định cấp độ cột cần melt khi làm việc với cột MultiIndex. -
ignore_index: NếuTrue(mặc định), tạo chỉ mục tuần tự mới. NếuFalse, giữ nguyên chỉ mục gốc.
Tôi sẽ minh họa bằng một ví dụ để bạn thấy cú pháp trên thay đổi dữ liệu như thế nào.
Giả sử bạn có bộ dữ liệu dưới đây, trong đó doanh số theo tháng của mỗi sản phẩm được lưu ở các cột riêng.

Bạn có thể dùng pandas.melt() để chuyển các cột tháng thành các hàng.
# Convert the DataFrame from wide format to long format
products_sales_2025_melted = products_sales_2025.melt(
# Keep the Product and Category columns unchanged
id_vars=["Product", "Category"],
# Convert the month columns into rows
value_vars=["January", "February", "March", "April", "May", "June"],
# Name of the new column that stores the original column names
var_name="Month",
# Name of the new column that stores the corresponding sales values
value_name="Sales"
)
# Display the reshaped DataFrame
products_sales_2025_melted.head(10)
DataFrame kết quả giờ lưu mỗi tháng thành một hàng riêng.

Các ví dụ phổ biến với pandas.melt()
Giờ bạn đã hiểu cách hoạt động của cú pháp pandas.melt(), tôi sẽ cho bạn thấy hành vi của từng tham số khi dùng riêng lẻ. Chúng ta sẽ dùng bảng trên trong các ví dụ sau.
Melt các cột đã chọn
Tham số value_vars cho phép bạn chỉ định những cột nào cần unpivot. Thay vì melt mọi tháng, bạn chỉ chuyển đổi những cột cần thiết.
Trong ví dụ này, chỉ các cột January và February được melt. Các cột tháng còn lại bị bỏ qua.
# Convert only the January and February columns into rows
product_sales_3month = products_sales_2025.melt(
id_vars="Product",
value_vars=["January", "February",]
)
product_sales_3month.head(20)

Giữ các cột định danh
Dùng tham số id_vars để giữ nguyên một hoặc nhiều cột trong khi các cột còn lại được tái cấu trúc.
Trong ví dụ dưới đây, “Product” và “Category” giữ nguyên, còn các cột doanh số theo tháng được chuyển thành hàng.
# Keep the Product and Category columns while melting the monthly sales
product_sales_cat = products_sales_2025.melt(
id_vars=["Product", "Category"]
)
product_sales_cat.head()

Đổi tên các cột đầu ra
Bạn có thể nhận thấy mặc định các cột đầu ra được đặt tên variable và value. Hãy dùng đối số var_name và value_name để đặt tên mô tả hơn.
Ví dụ, chúng tôi đổi tên cột biến thành “Month” và cột giá trị thành “Sales” trong đầu ra dưới đây.
# Keep the Product and Category columns while melting the monthly sales
# Rename Month and Sales columns
product_sales_cat = products_sales_2025.melt(
id_vars=["Product", "Category"],
var_name="Month",
value_name="Sales"
)
product_sales_cat.head()

Giữ nguyên chỉ mục gốc
Theo mặc định, pandas.melt() tạo chỉ mục tuần tự mới. Đặt ignore_index=False để giữ chỉ mục hàng gốc.
# Keep the original row index after reshaping
product_sales_index = products_sales_2025.melt(
id_vars=["Product", "Category"],
var_name="Month",
value_name="Sales",
ignore_index=False
)
product_sales_index.head(10)

Trong ví dụ trên, nhãn hàng gốc (0–5) được lặp lại cho mỗi tháng thay vì bị thay thế bằng chỉ mục tuần tự mới.
Khi nào bạn nên dùng pandas.melt()?
pandas.melt() hữu ích khi dữ liệu của bạn ở dạng rộng và cần chuyển sang dạng dài để phân tích hoặc trực quan hóa. Tôi cũng thấy hàm này quan trọng trong các trường hợp sau:
-
Chuyển dữ liệu dạng rộng sang dạng dài: Nhiều bộ dữ liệu lưu các giá trị liên quan trên nhiều cột. Tuy dễ đọc, định dạng này có thể gây khó khăn cho phân tích.
pandas.melt()gộp các cột đó vào một cột duy nhất trong khi vẫn giữ các cột định danh, tạo cấu trúc gọn gàng hơn cho các bước xử lý tiếp theo. -
Chuẩn bị dữ liệu để vẽ biểu đồ: Nhiều thư viện vẽ, như Seaborn, hoạt động tốt nhất với dữ liệu dạng dài khi tạo biểu đồ. Thay vì tự gộp nhiều cột, bạn có thể dùng
pandas.melt()để tái cấu trúc dữ liệu về định dạng mà các thư viện này mong đợi. -
Chuẩn bị dữ liệu cho phân tích thống kê: Nhiều thao tác trong pandas, bao gồm
groupby(), tổng hợp, lọc và thống kê tóm tắt, trở nên đơn giản hơn khi các phép đo được lưu trong một cột thay vì rải rác nhiều cột. Nếu bạn tái cấu trúc dữ liệu bằngpandas.melt(), lượng mã cần để phân tích các biến khác nhau sẽ giảm đi. -
Tạo bộ dữ liệu tidy: Một bộ dữ liệu tidy lưu mỗi biến trong một cột riêng và mỗi quan sát trong một hàng riêng. Nếu bộ dữ liệu của bạn chứa các phép đo lặp lại trên nhiều cột,
pandas.melt()thường là cách nhanh nhất để chuyển nó về định dạng tidy.
Tôi khuyên bạn học Khóa học Giới thiệu Trực quan hóa Dữ liệu với Seaborn để học cách tạo và tùy chỉnh nhiều loại biểu đồ trong Python, bao gồm scatter, count, bar và box plot.
pandas.melt() so với các hàm tái cấu trúc khác
Pandas cung cấp nhiều hàm để tái cấu trúc dữ liệu, mỗi hàm phục vụ một mục đích khác nhau. Hãy cùng xem sự khác biệt giữa từng phương pháp.
pandas.melt() so với pivot()
Bảng dưới đây cho thấy sự khác nhau giữa các hàm pandas.melt() và pivot().
|
|
|
|
Chuyển dữ liệu rộng thành dữ liệu dài. |
Chuyển dữ liệu dài thành dữ liệu rộng. |
|
Biến các cột thành các hàng. |
Biến các giá trị hàng thành các cột. |
|
Hữu ích để chuẩn bị dữ liệu cho phân tích và trực quan hóa. |
Hữu ích để tóm tắt hoặc trình bày dữ liệu trong báo cáo. |
Vì vậy, hãy chọn melt() khi các phép đo của bạn rải trên nhiều cột, hoặc pivot() khi bạn muốn trải các giá trị hàng thành nhiều cột.
pandas.melt() so với stack()
Dù cả hai hàm đều tái cấu trúc dữ liệu, chúng khác nhau như sau.
|
|
|
|
Tái cấu trúc các cột bình thường thành các hàng. |
Chuyển một hoặc nhiều cấp độ cột vào chỉ mục. |
|
Tạo ra một DataFrame tiêu chuẩn. |
Tạo ra một Series hoặc DataFrame với MultiIndex. |
|
Dễ đọc và sử dụng cho hầu hết tác vụ phân tích. |
Phù hợp hơn cho các thao tác tái cấu trúc dựa trên chỉ mục. |
Bạn có thể dùng stack() khi cần làm việc với chỉ mục phân cấp hoặc đối tượng MultiIndex.
pandas.melt() so với wide_to_long()
Cả hai hàm đều chuyển dữ liệu rộng sang dạng dài, nhưng chúng được thiết kế cho các tình huống khác nhau như dưới đây.
|
|
|
|
Linh hoạt và hoạt động với hầu như mọi DataFrame. |
Thiết kế cho các bộ dữ liệu có mẫu đặt tên cột nhất quán. |
|
Phù hợp cho tái cấu trúc mục đích chung. |
Lý tưởng cho các phép đo lặp lại như Sales_2023, Sales_2024 và Sales_2025. |
Nếu bộ dữ liệu của bạn có tên cột không đều, hãy dùng melt(). Nếu cột tuân theo quy ước đặt tên dễ đoán, hãy dùng wide_to_long() để tái cấu trúc với ít mã hơn.
Các lỗi thường gặp với pandas.melt()
Mặc dù pandas.melt() khá dễ dùng, dưới đây là những sai sót phổ biến tôi từng gặp và cách khắc phục.
-
Quên id_vars: Nếu bạn không chỉ định
id_vars, pandas sẽ coi mọi cột không nằm trongvalue_varslà cột giá trị. Điều này có thể tái cấu trúc cả những cột bạn định giữ làm định danh. Để khắc phục, hãy luôn xác định các cột mô tả duy nhất mỗi bản ghi và truyền chúng vàoid_vars. -
Melt nhầm cột: Nếu bạn bỏ qua
value_vars, pandas sẽ melt tất cả các cột không có trongid_vars. Điều này có thể bao gồm các cột bạn không định tái cấu trúc. Do đó, hãy luôn chỉ địnhvalue_varskhi bạn chỉ muốn melt một phần tập cột. -
Hiểu nhầm hình dạng đầu ra: Sau khi melt, số hàng sẽ tăng vì mỗi cột được chọn trở thành một hàng riêng cho mỗi bản ghi. Ví dụ, một DataFrame có 10 hàng và 12 cột tháng sẽ tạo ra 120 hàng sau khi melt các cột tháng. Do đó, hãy luôn kiểm tra kích thước trước và sau khi tái cấu trúc để xác nhận dữ liệu đã melt đúng.
-
Nhầm lẫn giữa dạng rộng và dạng dài: Hãy nhớ rằng với dạng rộng, các giá trị tương tự được lưu trên nhiều cột. Với dạng dài, các giá trị tương tự được lưu trong một cột, kèm một cột khác định danh biến.
Thực hành tốt khi dùng pandas.melt()
Để mã tái cấu trúc dễ hiểu và dễ bảo trì hơn, tôi khuyến nghị làm theo các thực hành sau khi dùng hàm pandas.melt():
-
Xác định các cột định danh trước: Quyết định cột nào nên giữ nguyên, rồi truyền chúng vào
id_vars. -
Đổi tên cột được tạo ra: Dùng
var_namevàvalue_namethay vì dựa vào tên mặc định là variable và value. -
Kiểm tra số hàng sau khi melt: Xác minh số lượng hàng khớp với kỳ vọng của bạn, đặc biệt khi melt nhiều cột.
-
Dùng pivot() để chuyển dữ liệu về lại: Nếu cần khôi phục định dạng rộng ban đầu sau phân tích, hãy dùng hàm
pivot().
Hãy khóa Writing Efficient Python Code để học cách viết mã hiệu quả, dễ gỡ lỗi và bảo trì.
Kết luận
pandas.melt() là hàm tiêu chuẩn của pandas để chuyển dữ liệu dạng rộng sang dạng dài. Khi hiểu rõ vai trò của id_vars và value_vars, bạn có thể kiểm soát cột nào giữ làm định danh và cột nào được chuyển thành hàng.
Để hiểu sâu hơn về Python, bạn có thể học thêm từ các lộ trình kỹ năng Python Data Fundamentals và Python Programming Fundamentals của chúng tôi.
Câu hỏi thường gặp
Khi nào tôi nên dùng pandas.melt()?
Hãy dùng khi dữ liệu của bạn có các giá trị lặp lại rải trên nhiều cột và bạn muốn một DataFrame dạng dài để phân tích hoặc trực quan hóa.
var_name và value_name là gì?
Các tham số này đổi tên các cột được tạo ra để lưu tên cột gốc và các giá trị tương ứng của chúng.
pandas.melt() có sửa đổi DataFrame gốc không?
Không. Hàm trả về một DataFrame mới đã tái cấu trúc và giữ nguyên bản gốc.
Sự khác nhau giữa melt() và pivot() là gì?
melt() chuyển dữ liệu rộng sang dạng dài, còn pivot() chuyển dữ liệu dài trở lại dạng rộng.
Sự khác nhau giữa melt() và stack() là gì?
melt() tái cấu trúc các cột thành hàng trong khi vẫn giữ DataFrame thông thường. stack() chuyển các cột vào chỉ mục và tạo cấu trúc phân cấp (MultiIndex).
