Skip to content

Merge & Join

ข้อมูลจริงมักกระจายอยู่หลายตาราง — ตารางสินค้า, ตารางลูกค้า, ตารางออเดอร์ pd.merge() ช่วยเชื่อมข้อมูลเหล่านี้เข้าด้วยกัน

สร้างข้อมูลตัวอย่าง

Section titled “สร้างข้อมูลตัวอย่าง”
import pandas as pd
orders = pd.DataFrame({
"order_id": [1, 2, 3, 4],
"customer_id": ["C001", "C002", "C003", "C001"],
"amount": [500, 1200, 350, 800]
})
customers = pd.DataFrame({
"customer_id": ["C001", "C002", "C004"],
"name": ["Alice", "Bob", "Diana"],
"city": ["กรุงเทพ", "เชียงใหม่", "ภูเก็ต"]
})
# เฉพาะแถวที่ match ทั้งสองตาราง
result = pd.merge(orders, customers, on="customer_id")
print(result)
# order_id customer_id amount name city
# 1 C001 500 Alice กรุงเทพ
# 2 C002 1200 Bob เชียงใหม่
# 4 C001 800 Alice กรุงเทพ
# C003 หายไป (ไม่มีใน customers), C004 หายไป (ไม่มีใน orders)
# Left join — เก็บทุกแถวจากตารางซ้าย
result = pd.merge(orders, customers, on="customer_id", how="left")
# C003 จะมี name=NaN, city=NaN
# Right join — เก็บทุกแถวจากตารางขวา
result = pd.merge(orders, customers, on="customer_id", how="right")
# C004 จะมี order_id=NaN, amount=NaN
# Outer join — เก็บทุกแถวจากทั้งสองตาราง
result = pd.merge(orders, customers, on="customer_id", how="outer")
# ปัญหาที่พบบ่อยมาก!
df1 = pd.DataFrame({"code": ["001", "002", "003"], "name": ["A", "B", "C"]})
df2 = pd.DataFrame({"code": [1, 2, 3], "value": [100, 200, 300]})
# merge จะไม่เจอเลย เพราะ "001" != 1
bad = pd.merge(df1, df2, on="code") # Empty DataFrame!
# แก้ไข: ทำให้ type ตรงกันก่อน merge
df2["code"] = df2["code"].astype(str).str.zfill(3)
good = pd.merge(df1, df2, on="code") # สำเร็จ!

ตรวจสอบผลลัพธ์ merge

Section titled “ตรวจสอบผลลัพธ์ merge”
# ใช้ indicator=True เพื่อดูว่าแต่ละแถวมาจากไหน
result = pd.merge(orders, customers, on="customer_id",
how="outer", indicator=True)
print(result["_merge"].value_counts())
# both 3 ← match ทั้งคู่
# left_only 1 ← มีใน orders อย่างเดียว
# right_only 1 ← มีใน customers อย่างเดียว