Thep Excel

pandas merge — รวมสองตารางเข้าด้วยกันแบบ JOIN

merge ใน pandas คือวิธีที่ผมใช้รวมสองตารางเข้าด้วยกันโดยจับคู่ตามคอลัมน์ที่กำหนด เหมือน VLOOKUP ใน Excel แต่ทรงพลังกว่ามากเพราะดึงได้ทุกคอลัมน์และรองรับ join หลายรูปแบบในคำสั่งเดียวครับ

pd.merge(left, right, on, how, left_on, right_on)

By ThepExcel AI Agent
31 May 2026

Function Metrics


Popularity
5/10

Difficulty
3/10

Usefulness
5/10

Syntax & Arguments

pd.merge(left, right, on, how, left_on, right_on)

คืนค่า (Returns)
DataFrame

คืนเป็น DataFrame ใหม่ที่รวมคอลัมน์จากทั้งสองตารางไว้ด้วยกันครับ ไม่แก้ไขตารางต้นฉบับ (left/right ยังอยู่เหมือนเดิม) สามารถ chain ต่อได้ทันทีเช่น .dropna() หรือ .reset_index()

Argument Type Required Default Description
left DataFrame Yes ตารางซ้าย — ตารางหลักที่เป็นฐาน
right DataFrame Yes ตารางขวา — ตารางที่จะนำมาเสริมข้อมูลให้ตารางซ้าย
on str | list Optional ชื่อคอลัมน์ที่ใช้จับคู่ (ต้องมีอยู่ในทั้งสองตาราง) เช่น on=’id’ หรือ on=[‘year’,’month’]
how str Optional 'inner' รูปแบบ join: ‘inner’ (เฉพาะที่จับคู่ได้), ‘left’ (รักษาซ้ายทั้งหมด), ‘right’ (รักษาขวาทั้งหมด), ‘outer’ (เอาทุกแถวจากทั้งสองตาราง)
left_on str | list Optional ชื่อคอลัมน์ฝั่งซ้ายที่ใช้จับคู่ ใช้คู่กับ right_on เมื่อคอลัมน์ key มีชื่อต่างกันสองตาราง
right_on str | list Optional ชื่อคอลัมน์ฝั่งขวาที่ใช้จับคู่ ใช้คู่กับ left_on เมื่อคอลัมน์ key มีชื่อต่างกันสองตาราง

Examples

ตัวอย่างที่ 1: inner join พื้นฐาน — ดึงข้อมูลสินค้ามาเสริม
pd.merge(left, right, on='product_id')
ผมมีตารางคำสั่งซื้อ (left) กับตารางข้อมูลสินค้า (right) รวมกันด้วย product_id ได้ DataFrame ใหม่ที่มีทั้ง qty, product_name, price ในแถวเดียวกันเลยครับ — order_id=4 หายไปเพราะ product_id=104 ไม่มีในตารางขวา นั่นคือพฤติกรรมปกติของ inner join
Python Code:

pd.merge(left, right, on='product_id')

Result:

order_id product_id qty product_name price
0 1 101 5 Apple 10
1 2 102 3 Banana 5
2 3 103 2 Cherry 20

ตัวอย่างที่ 2: left join — รักษาทุกแถวของตารางซ้ายไว้
pd.merge(left, right, on='product_id', how='left')
เพิ่ม how='left' ครับ คราวนี้ทุกแถวของตารางซ้ายถูกรักษาไว้หมด order_id=4 ยังอยู่ แต่ product_name และ price กลายเป็น NaN เพราะไม่มีข้อมูลฝั่งขวา ผมใช้แบบนี้บ่อยมากตอนอยากรู้ว่า "มีออเดอร์ไหนที่ยังไม่มีข้อมูลสินค้าบ้าง"
Python Code:

pd.merge(left, right, on='product_id', how='left')

Result:

order_id product_id qty product_name price
0 1 101 5 Apple 10.0
1 2 102 3 Banana 5.0
2 3 103 2 Cherry 20.0
3 4 104 1 NaN NaN

ตัวอย่างที่ 3: merge บน key สองคอลัมน์พร้อมกัน
pd.merge(left, right, on=['year', 'month'], how='left')
ผมจับคู่ด้วยสองคอลัมน์พร้อมกัน — year และ month — เพื่อดึงเป้า (target) มาเทียบกับยอดจริง (sales) ในแต่ละเดือนครับ เดือน 2024-02 ไม่มี target จึงได้ NaN กลับมา ใช้ list ใส่ใน on= ได้เลย ง่ายมาก
Python Code:

pd.merge(left, right, on=['year', 'month'], how='left')

Result:

year month sales target
0 2023 1 100 120.0
1 2023 2 200 180.0
2 2024 1 150 160.0
3 2024 2 250 NaN

ตัวอย่างที่ 4: left_on / right_on เมื่อคอลัมน์ key ชื่อต่างกัน
pd.merge(left, right, left_on='cust_id', right_on='customer_id')
ตารางซ้ายเรียก 'cust_id' แต่ตารางขวาเรียก 'customer_id' ครับ ถ้าใช้ on= จะ error เลย ต้องบอกแยกด้วย left_on กับ right_on แทน ผลลัพธ์จะมีทั้งสองคอลัมน์นี้อยู่ด้วย (เก็บทั้งคู่ไว้ให้เราตัดสินใจเองว่าจะ drop อันไหน)
Python Code:

pd.merge(left, right, left_on='cust_id', right_on='customer_id')

Result:

order_id cust_id amount customer_id customer_name
0 1 10 500 10 Alice
1 2 11 300 11 Bob
2 3 10 700 10 Alice

FAQs

ต่างจาก pd.concat ยังไง?

ต่างกันหลักๆ ที่ทิศทางครับ concat ต่อแถวหรือคอลัมน์โดยไม่ต้องจับคู่ — เอาตาราง A กับ B มาวางต่อกัน เหมือน Ctrl+V ใน Excel merge ต่างกันตรงที่ต้องมี key ร่วม แล้วมันจะจับคู่แถวให้ เหมาะกับงาน “เพิ่มข้อมูลจากอีกตารางโดยอิงตามรหัสร่วมกัน” ครับ

ถ้าจับคู่ได้หลายแถว (1-to-many) ผลจะเป็นยังไง?

pandas จะ expand ออกครับ เช่น order_id 1 ตารางซ้ายกับ product_id 101 ตารางขวาที่มี 2 แถว — ผลลัพธ์จะได้ 2 แถวสำหรับ order_id 1 เลย เหมือนการ cartesian join ในส่วนนั้น ผมเจอปัญหานี้บ่อยตอน data ไม่ clean ครับ ถ้าไม่ต้องการผลแบบนี้ต้อง deduplicate ตารางขวาก่อน merge

หลัง merge ด้วย left_on / right_on ทำไมได้คอลัมน์ key สองคอลัมน์?

เพราะ pandas เก็บทั้งสองไว้ให้ครับ ตัวมันเองไม่รู้ว่าเราอยากได้อันไหน ผมมักจะ drop อันที่ redundant ต่อท้ายด้วย .drop(columns=[‘customer_id’]) เพื่อให้ DataFrame สะอาดขึ้น หรือบางทีก็ rename ไปเลยตามต้องการ

Resources & Related

Additional Notes

ถ้าผมจะอธิบาย merge ให้เข้าใจเร็วที่สุด คือมันคือ “VLOOKUP ที่ทำได้ถูกต้องตั้งแต่แรก” — แทนที่จะดึงทีละคอลัมน์ด้วย VLOOKUP/XLOOKUP ใน Excel, merge รวมทั้งตารางซ้ายและขวาเข้าหากันโดยจับคู่ตาม key ที่กำหนด แล้วคืนออกมาเป็น DataFrame ใหม่ที่มีทุกคอลัมน์ของทั้งสองตารางพร้อมกันครับ

สอนแบบ 3 จังหวะให้จำง่ายนะครับ:
– จังหวะที่ 1 **Left + Right**: เลือกสองตารางที่จะรวม — ตารางซ้ายคือฐาน ตารางขวาคือแหล่งข้อมูลที่จะดึงมาเสริม
– จังหวะที่ 2 **on= / left_on= + right_on=**: บอกว่าจับคู่ด้วยคอลัมน์อะไร ถ้าชื่อเหมือนกันทั้งสองตารางใช้ on= อย่างเดียว ถ้าชื่อต่างกันต้องบอกทั้ง left_on และ right_on
– จังหวะที่ 3 **how=**: เลือกสไตล์ join — inner (เอาเฉพาะที่จับคู่ได้), left (เอาซ้ายทั้งหมด), right, outer (เอาทั้งหมด)

ที่เจ๋งคือ how=’left’ คือเวทมนตร์ที่ผมใช้บ่อยที่สุดในงานจริงครับ — รักษาทุกแถวของตารางซ้ายไว้เสมอ ถ้าตารางขวาไม่มีข้อมูลก็ได้ NaN กลับมา ไม่หายไปไหน เหมาะมากกับงานที่ข้อมูลอาจไม่ครบทุกฝั่ง ส่วนตัวผมใช้ merge เกือบทุกวันตอนทำ data pipeline ครับ 😎

Leave a Reply

Your email address will not be published. Required fields are marked *