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

Liên hệ QC

Người dùng đang xem chủ đề này

Hai Lúa Miền Tây

❆❆❆❆❆❆❆❆
Thành viên BQT
Administrator
Tham gia
18/3/08
Bài viết
8,310
Được thích
15,867
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

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ẻ.
 
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

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')

View attachment 305188

Các bạn có thể tham khảo thêm ở file đính kèm nhé.
Để kết quả bảng tính về đúng chuẩn như hình 2 bên dưới thì mình phải làm như thế nào? Mời các bạn tham gia nhé.

1730517770352.png
 
Thử với hậu tố HK1, HK2 không phải là số, ví dụ Toán_HK1, Toán_HKa, Lý_HK1, Lý_HKb, Hóa_HK1, Hóa_HK2 xem sao
 
Thử với hậu tố HK1, HK2 không phải là số, ví dụ Toán_HK1, Toán_HKa, Lý_HK1, Lý_HKb, Hóa_HK1, Hóa_HK2 xem sao
Trừ trường hợp các môn ở HK2 khác HK1 thôi chứ đặt tên ghép như vậy là phản chuẩn CSDL LH. Khi đưa ra cách là việc với Data Model, MS đã hết sức dụ người dùng làm quen với CSDL LH. Không biết vì lý do gì mà các tên hàm và meta data khác với luật CSDL LH của IBM SQL như vậy

Nếu HK2 thực sự khác HK1 thì cách đặt tên cần xem lại.
 
Web KT

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

Back
Top Bottom