Hàm chuyển dữ liệu từ cột sang dòng (Hàm melt + wide_to_long của Python trong Excel)

Liên hệ QC

Hai Lúa Miền Tây

❆❆❆❆❆❆❆❆
Thành viên BQT
Administrator
Tham gia
18/3/08
Bài viết
8,304
Được thích
15,845
Giới tính
Nam
Nghề nghiệp
Làm ruộng.
Đôi khi bạn muốn chuyển đổi dữ liệu từ dạng cột sang hàng (UnPivot). Bạn có thể dùng Power PI, VBA... để chuyển đổi hoặc dùng hàm melt của Python trong Excel 365 như sau để chuyển đổi.

Cú pháp cơ bản:
Mã:
pd.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name='value')

Trong đó:
  • frame: DataFrame đầu vào.
  • id_vars: Cột (hoặc các cột) sẽ được giữ nguyên (không thay đổi).
  • value_vars: Cột (hoặc các cột) sẽ được gộp lại.
  • var_name: Tên của cột mới chứa tên của các cột đã gộp.
  • value_name: Tên của cột mới chứa giá trị của các cột đã gộp.
Ví dụ: Tôi có bảng dữ liệu sau

1730278025945.png

Muốn 3 cột Toán, Lý, Hoá và điểm số tương ứng được gộp lại như sau:

1730278076416.png

Vậy tôi sẽ dùng hàm melt với cú pháp như sau:

Mã:
pd.melt(xl("A1:E4", headers=True),id_vars=['MsHS','Họ Và Tên'],value_vars=['Hoá','Lý','Toán'],var_name='Môn',value_name='Điểm')

1730278195696.png

Bạn có thể xem thêm ở file đính kèm nhé.
 

File đính kèm

  • melt (UnPivot).xlsx
    10.8 KB · Đọc: 9
Như cột thông tin value_vars=['Hoá','Lý','Toán'] nhiều hơn, mình có cách nào dùng hàm tự động lấy thêm các trước khác k anh ơi, cám ơn anh đã chia sẻ.
Bạn thử:

Python:
df = xl("A1:E4",True)
info = list(df)[:2]
sbj = list(df)[2:]
df.melt(id_vars=info,value_vars=sbj,var_name='Môn',value_name='Điểm')
 
Lần chỉnh sửa cuối:
Cũng được nhưng mà phụ thuộc nhiều thứ, chạy không nhanh lắm! Chưa thú vị!
1730432256038.png
Em chào anh Tùng, em thấy cũng thú vị đó mà :D . melt chuyển wide sang long ngon, mà dữ liệu nhiều thì cũng khá mệt thật. Split liên tục thì cũng có thể không hiệu quả :D. Em cũng mới sử dụng thôi. Lên có topic về Python trong Excel này lại khoái quá. Mong học hỏi từ các anh chị !
 
Cũng được nhưng mà phụ thuộc nhiều thứ, chạy không nhanh lắm! Chưa thú vị!
View attachment 305175
Cám ơn các bạn đã tham gia.
Để đơn giản hơn mình xin giới thiệu hàm wide_to_long với chức năng là cũng chuyển từ dạng cột sang dòng như sau:

Cú pháp cơ bản:

Mã:
pd.wide_to_long(frame, stubnames, i, j, sep='')

Trong đó:
  • frame: DataFrame đầu vào.
  • stubnames: Danh sách các tên gốc của các cột mà bạn muốn gộp.
  • i: Tên của cột hoặc các cột dùng làm chỉ số duy nhất cho từng hàng.
  • j: Tên của cột mới chứa các giá trị từ phần còn lại của tên cột (phần không phải stubnames).
  • sep: Ký tự phân cách giữa stubnames và phần còn lại của tên cột.
Với bài toán trên thì mình áp dụng hàm wide_to_long như sau:

Mã:
pd.wide_to_long(xl("A1:H4", headers=True), stubnames=['Toán', 'Lý','Hoá'], i=['MsHS','Họ Và Tên'], j='Học kỳ', sep='_HK')

1730432297551.png

Các bạn có thể tham khảo thêm ở file đính kèm nhé.
 

File đính kèm

  • wide_to_long.xlsx
    11 KB · Đọc: 0
Web KT

Bài viết mới nhất

Back
Top Bottom