สำหรับบทความนี้เราจะมาพูดกันถึงเรื่องการเชื่อมข้อมูล DataFrame ใน pandas ซึ่งจะเป็นเนื้อหาเสริมสำหรับซีรี่ย์ pandas ที่เคยได้ทำเป็นคลิปสอนเอาไว้ เพื่อศึกษาเพิ่มเติมเกี่ยวกับเรื่อง DataFrame เนื้อหาส่วนนี้จะน่าสนใจเพียงไหน สามารถอ่านได้ในบทความนี้เลยครับ
Software & Tools
- Python version 3 +
- Jupyter Notebook
- pandas
- Nodepad
วิดีโอแนะนำ( YouTube): Python Pandas - dataframe, CSV, Excel ฉบับใช้งานจริง
Jupyter Notebook & import pandas
และก่อนที่จะเริ่มใช้งานให้ทำการเปิด Jupyter Notebook ขึ้นมา
ต่อมาให้ทำการอิมพอร์ต pandas เข้ามาใช้งาน
import pandas as pd
เมื่อเปิด Jupyter Notebook พร้อมทั้งอิมพอร์ตไลบรารี่ pandas เข้ามาเรียบร้อยเเล้วก็มาลุยกันเลยครับ Hey we go !!
การเชื่อมข้อมูลโดยผ่าน Columns ที่ชื่อเหมือนกัน
ถ้ามีตาราง DataFrame สองอันแล้วต้องการนำข้อมูลมาเชื่อมต่อรวมกันโดยอาศัยคอลัมน์หนึ่งเป็นตัวเชื่อมสามารถใช้ฟังก์ชัน pd.merge ได้
ตัวอย่าง
ทำการสร้างข้อมูล 2 ชุด ผ่าน Notepad หรือตามที่สะดวกได้เลยครับ
ชุดที่ 1
studentId thai1 thai2
1 7 5
2 8 6
3 6 5
4 7 7
5 5 8
6 7 9
7 8 9
เป็นข้อมูลที่แสดงถึงคะเเนนการสอบของวิชาภาษาไทยด้วยกันทั้งหมด 2 ครั้ง
ชุดที่ 2
studentId math1 math2
1 8 3
2 9 4
3 9 3
4 9 4
5 7 5
6 6 6
7 5 7
เป็นข้อมูลที่แสดงถึงคะเเนนการสอบของวิชาคณิตศาสตร์ด้วยกันทั้งหมด 2 ครั้ง
จากนั้นเรียกใช้งานด้วยคำสั่ง pd.read_csv พร้อมกำหนดตัวแปรดังรูปภาพด้านล่าง
A = pd.read_csv('data1.txt', sep='')
B = pd.read_csv('data2.txt', sep='')
ต่อไปเราจะทำการเชื่อมข้อมูลทั้ง 2 DataFrame เข้าด้วยกัน ด้วยคำสั่ง pd.merge ดังรูปภาพด้านล่าง
pd.merge(A, B)
จะเห็นว่าพอรวมกันแล้วได้ DataFrame ที่มีความเปลี่ยนเเปลงไป ซึ่งในส่วนของ Index เเละ คอลัมน์ studentId จะไม่ถูกเปลี่ยนแปลง สามารถบ่งบอกได้ว่า ในส่วนที่ไม่ถูกเปลี่ยนแปลงนั้นคือจุดที่ใช้ในการเชื่อมต่อ ซึ่งปกติถ้าไม่ได้ระบุอะไรนอกเหนือจาก DataFrame ที่จะใช้เชื่อมคอลัมน์ที่มีข้อมูลซ้ำกันในทั้งสอง DataFrame จะถูกใช้เป็นตัวเชื่อม แต่หากระบุไว้ในคอลัมน์ที่ถูกใช้เชื่อมจะมีเพียงอันเดียว เช่น ผมจะทำการสร้างตารางขึ้นมาใหม่ โดยอ้างอิงจาก DataFrame ชุดที่ 2 โดยจะเพิ่มคอลัมน์ thai2 จาก DataFrame ชุดที่ 1 เพื่อใช้ในการเชื่อมต่อแบบระบุคอลัมน์
ชุดที่ 3
studentId math1 math2 thai2
1 8 3 5
2 9 4 6
3 9 3 5
4 9 4 7
5 7 5 8
6 6 6 9
7 5 7 9
เป็นข้อมูลที่แสดงถึงคะเเนนการสอบของวิชาคณิตศาสตร์ 2 ครั้งรวมกับภาษาไทยครั้งที่ 2
จากนั้นเรียกใช้งานด้วย pd.read_csv พร้อมกำหนดตัวแปร จากนั้นให้ทำการเชื่อมเเบบเดิมโดยเพิ่มคำสั่ง on เข้าไป (ซึ่งผมจะกำหนดตัวแปรเป็น C ) ดังรูปภาพด้านล่าง
pd.merge(A, C, on='thai2')
ซึ่งจะเห็นได้ว่าในครั้งนี้มีการกำหนดจุดให้เชื่อมเพียงคอลัมน์เดียวจึงทำให้คอลัมน์อื่นที่มีข้อมูลซ้ำกันถูกเปลี่ยนแปลง นั่นคือคอลัมน์ studentId โดยถูกเติมชื่อท้ายให้โดยอัตโนมัติ
pd.merge(A, C, on='thai2',suffixes=[' *-*', ' -3-'])
รูปแบบของการเชื่อมโยงของ DataFrame ส่วนใหญ่นั้นต่างมีค่าเท่ากันหมด จริง ๆ แล้วไม่จำเป็นต้องเป็นเเบบนั้นก็ได้ ใน DataFrame หนึ่งอาจมีค่าที่ในอีก DataFrame ไม่มีอยู่ ในตัวอย่างที่ผ่านมานั้นข้อมูลในคอลัมน์ที่ใช้เชื่อมจากทั้ง 2 DataFrame ตัวอย่าง ผมจะเริ่มเเก้ไขข้อมูลใน DataFrame ชุดที่ 1 และ 2 โดยจะทำการเปลี่ยนเลขของคอลัมน์ studentId ให้ข้อมูลของทั้ง 1 เเละ 2 มีความเเตกต่างกัน เช่นชุดที่ 1 ที่ถูกเเก้ไขstudentId thai1 thai2
1 7 5
2 8 6
3 6 5
4 7 7
5 5 8
7 7 9
8 8 9ชุดที่ 2 ที่ถูกเเก้ไขstudentId math1 math2
1 8 3
2 9 4
3 9 3
4 9 4
5 7 5
7 6 6
9 5 7เมื่อทำการเชื่อม DataFrame แล้วจะได้ผลลัพธ์ดังรูปภาพด้านล่าง
pd.merge(A, B)
จะเห็นได้ว่าข้อมูลที่ถูกนำมาเชื่อมนั้นจะต้องมีตัวที่ซ้ำกันอยู่ในคอลัมน์ที่จะใช้เชื่อมกันในครั้งนั้น แต่ถ้าหากว่าต้องการแสดงในส่วนที่ขาดหายไปให้ใช้คำสั่ง how=‘outer’ เพิ่มเข้าไปดังรูปด้านล่าง
pd.merge(A, B, how='outer')
เมื่อชื่อ Columns ที่ต้องการเชื่อมไม่เหมือนกันทั้งสอง DataFrame
ไม่จำเป็นว่าสองคอลัมน์จากสองตารางที่เอามาเชื่อมกันจะมีค่าชื่อ ที่เหมือนกันเสมอไป ในกรณีที่ต่างกันแบบนี้จะต้องกำหนดชื่อคอลัมน์ที่ต้องการเชื่อมโดยใช้คำสั่ง left_on=‘ชื่อ column’ ใน Dataframe ด้านซ้าย และ right_on=‘ชื่อ column’ ใน DataFrame ด้านขวาตัวอย่าง ผมจะทำการเปลี่ยนชื่อคอลัมน์ student ใน DataFrame ที่ 2 เป็น ‘รหัสนักศึกษา’
ชุดที่ 2 ที่ถูกเเก้ไขรหัสนักศึกษา math1 math2
1 8 3
2 9 4
3 9 3
4 9 4
5 7 5
6 6 6
7 5 7
ซึ่งผลลัพธ์ที่จะได้นั้นคอลัมน์จะถูกแสดงผลออกมาทั้ง 2 ซึ่งจะมีข้อมูลด้านในเหมือนกันดังรูปด้านล่าง
pd.merge(A, B, left_on='studentId', right_on='รหัสนึกศึกษา')
สุดท้ายนี่เป็นคำสั่งที่ค่อนข้างที่จะต้องใช้บ่อยมาก นั่นคือการตั้งค่า Index โดยจะใช้คำสั่ง set_index และ inplace=True เพื่อให้ค่าที่ตั้งไว้เป็นฟอร์แมตนี้แบบถาวร ดังรูปภาพด้านล่าง
pd.merge(A, B, left_on='studentId', right_on='รหัสนักศึกษา')
a.set_index('รหัสนักศึกษา', inplace=True)
ศึกษาเพิ่มเติมใน Python Pandas Series
สามารถติดตามหรือศึกษาเพิ่มเติมได้ใน Pandas ซีรี่ย์ ทางช่องยูทูป stackpython
สอน pandas Ep.1 - Introduction
สอน pandas Ep.2 - DataFrame เบื้องต้น
สอน pandas Ep.3 - DataFrame (ต่อ)
สอน pandas Ep.4 - Graph
สอน pandas Ep.5 - การอ่านข้อมูลจาก website
สอน pandas Ep.6 - Columns
สอน pandas Ep.7 - Columns (จบ)
Nu STACKPYTHON
Follow us on
Medium: STACKPYTHON
Youtube: STACKPYTHON
Facebook: STACKPYTHON
