การเชื่อมตามดัชนี
ใช้ DataFrame.join() และกำหนด left_index/right_index=True ใน merge() เพื่อรวม DataFrames ที่จัดแนวตามดัชนี
การเชื่อมตามดัชนี เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
Join โดยอิงดัชนี
จนถึงตอนนี้ คุณได้ merge DataFrame โดยจับคู่ค่าที่อยู่ในคอลัมน์ทั่วไป แต่บางครั้งข้อมูลที่ต้องการใช้จับคู่อาจถูกเก็บไว้ในดัชนีของ DataFrame แทนที่จะอยู่ในคอลัมน์ Pandas รองรับการ join โดยอิงดัชนีผ่าน DataFrame.join() และผ่าน pd.merge() โดยใช้พารามิเตอร์ left_index=True หรือ right_index=True
เมธอด DataFrame.join()
DataFrame.join(other) เป็นเมธอดอำนวยความสะดวกที่โดยค่าเริ่มต้นจะ join ด้วยดัชนีของ DataFrame ทั้งสองชุด ซึ่งเทียบเท่ากับการเรียก pd.merge() พร้อม left_index=True, right_index=True ประเภท join เริ่มต้นคือ 'left' ต่างจาก pd.merge() ที่มีค่าเริ่มต้นเป็น 'inner' DataFrame ทั้งสองชุดต้องใช้ป้ายกำกับดัชนีที่มีความหมายร่วมกัน เพื่อให้การ join ได้ผลลัพธ์ที่ถูกต้อง
import pandas as pd
profiles = pd.DataFrame(
{'age': [25, 30, 22]},
index=['alice', 'bob', 'carol']
)
scores = pd.DataFrame(
{'score': [88, 95, 70]},
index=['alice', 'carol', 'dave']
)
# join: left join on index (default)
result = profiles.join(scores)
print(result)
# age score
# alice 25 88.0
# bob 30 NaN <- bob has no score
# carol 22 95.0การควบคุมประเภท Join ใน join()
ส่งพารามิเตอร์ how ให้กับ join() เพื่อกำหนดว่าจะเก็บแถวใดไว้ เช่นเดียวกับ pd.merge() ตัวเลือกได้แก่ 'left' (ค่าเริ่มต้น), 'right', 'inner' และ 'outer' ตัวอย่างเช่น how='inner' จะเก็บเฉพาะดัชนีที่ปรากฏอยู่ใน DataFrames ทั้งสองรายการ และลบแถวของ alice ออกหากไม่มีดัชนีที่ตรงกันในตารางด้านขวา
# Inner join on index: only rows present in BOTH indices
print(profiles.join(scores, how='inner'))
# age score
# alice 25 88
# carol 22 70
# Outer join: all indices from both
print(profiles.join(scores, how='outer'))
# age score
# alice 25.0 88.0
# bob 30.0 NaN
# carol 22.0 70.0
# dave NaN 95.0การเชื่อม DataFrames หลายรายการพร้อมกัน
ข้อได้เปรียบสำคัญของ join() เหนือ pd.merge() คือสามารถรับ รายการ ของ DataFrames แล้วเชื่อมทั้งหมดเข้ากับ DataFrame ที่เรียกใช้ได้ภายในการเรียกครั้งเดียว DataFrames ทั้งหมดต้องจัดแนวตามดัชนีเดียวกัน วิธีนี้สะดวกมากเมื่อมีตารางคุณลักษณะหลายตารางที่ใช้คีย์เดียวกันเป็นดัชนี เช่น ID ผู้ใช้หรือวันที่ และต้องการนำมาประกอบเป็น DataFrame แบบกว้างหนึ่งรายการ
emails = pd.DataFrame({'email': ['a@x.com', 'b@x.com', 'c@x.com']},
index=['alice', 'bob', 'carol'])
city = pd.DataFrame({'city': ['NY', 'LA', 'SF']},
index=['alice', 'bob', 'carol'])
# Join multiple DataFrames at once
result = profiles.join([emails, city])
print(result)
# age email city
# alice 25 a@x.com NY
# bob 30 b@x.com LA
# carol 22 c@x.com SFการเชื่อมโดยใช้คอลัมน์ในตารางหนึ่งและดัชนีในอีกตารางหนึ่ง
pd.merge() ช่วยให้ผสมการจับคู่ตามคอลัมน์และตามดัชนีได้ด้วย left_on/right_index หรือ left_index/right_on วิธีนี้มีประโยชน์เมื่อ DataFrame หนึ่งเก็บคีย์ไว้ในคอลัมน์ แต่อีก DataFrame ใช้คีย์นั้นเป็นดัชนี คุณไม่สามารถทำเช่นนี้ได้ด้วย join() เพียงอย่างเดียว
# orders has customer_id as a column; customers is indexed by customer_id
customers_indexed = pd.DataFrame(
{'name': ['Alice', 'Bob', 'Carol']},
index=[101, 102, 103]
)
orders = pd.DataFrame({
'order_id': [1, 2, 3],
'customer_id': [101, 102, 101]
})
result = pd.merge(orders, customers_indexed,
left_on='customer_id', right_index=True)
print(result)
# order_id customer_id name
# 0 1 101 Alice
# 2 3 101 Alice
# 1 2 102 Bobการใช้ left_index และ right_index ใน merge()
เมื่อ DataFrames ทั้งสองรายการมีคีย์เป็นดัชนี ให้ใช้ pd.merge(left, right, left_index=True, right_index=True) ซึ่งเทียบเท่ากับ join() แต่มีชนิดการเชื่อมเริ่มต้นเป็น 'inner' และระบุพารามิเตอร์ได้ชัดเจนกว่า นอกจากนี้ยังเข้าถึงพารามิเตอร์อื่น ๆ ของ pd.merge() ได้ เช่น suffixes และ indicator
# Both DataFrames indexed by user_id
demog = pd.DataFrame({'age': [25, 30]}, index=[1, 2])
behav = pd.DataFrame({'clicks': [10, 5]}, index=[1, 2])
# Equivalent joins
result1 = demog.join(behav) # left join
result2 = pd.merge(demog, behav, left_index=True, right_index=True) # inner join
print(result1)
print(result2)เหตุใดจึงควรใช้การเชื่อมตามดัชนี
ควรใช้การเชื่อมตามดัชนีเมื่อ DataFrames ของคุณมีตัวระบุที่มีความหมายเป็นคีย์โดยธรรมชาติ เช่น ID ผู้ใช้ SKU สินค้า หรือวันที่ การใช้ดัชนีในการเชื่อมช่วยหลีกเลี่ยงการเพิ่มคอลัมน์คีย์ซ้ำซ้อนลงใน DataFrame และอาจทำงานได้เร็วกว่า เพราะ Pandas รักษาโครงสร้างดัชนีที่เรียงลำดับไว้สำหรับการค้นหาแบบ O(log n) การเชื่อมลักษณะนี้พบได้บ่อยเป็นพิเศษในข้อมูลอนุกรมเวลา ซึ่ง DatetimeIndex เป็นคีย์สำหรับการเชื่อมตามธรรมชาติ
# Time series example: join temperature and humidity by date index
import numpy as np
dates = pd.date_range('2024-01-01', periods=5)
temp = pd.DataFrame({'temp_c': [10, 12, 9, 11, 13]}, index=dates)
humid = pd.DataFrame({'humidity': [65, 70, 60, 75, 68]}, index=dates)
weather = temp.join(humid)
print(weather.head())การจัดการชื่อคอลัมน์ที่ซ้ำกัน
เมื่อ DataFrames ทั้งสองรายการมีคอลัมน์ชื่อเดียวกัน (นอกเหนือจากคีย์) join() จะทำให้เกิด ValueError ตามค่าเริ่มต้น เว้นแต่คุณจะระบุพารามิเตอร์ lsuffix และ rsuffix พารามิเตอร์เหล่านี้ทำงานคล้ายกับ suffixes ใน pd.merge() โดยต่อท้ายสตริงเข้ากับชื่อคอลัมน์ที่ซ้ำกันของ DataFrame ด้านซ้ายและด้านขวาตามลำดับ
df_a = pd.DataFrame({'value': [1, 2]}, index=['x', 'y'])
df_b = pd.DataFrame({'value': [10, 20]}, index=['x', 'y'])
# Without suffixes: raises ValueError
# result = df_a.join(df_b)
# With suffixes: disambiguate column names
result = df_a.join(df_b, lsuffix='_left', rsuffix='_right')
print(result)
# value_left value_right
# x 1 10
# y 2 20set_index ก่อนการเชื่อม
กระบวนการทำงานที่ใช้กันทั่วไปคือ กำหนดคอลัมน์ให้เป็นดัชนี ก่อนการเชื่อม เพื่อให้คุณใช้ไวยากรณ์ของ join() ได้ หลังการเชื่อม reset_index() จะนำคีย์กลับมาเป็นคอลัมน์ปกติ รูปแบบนี้อ่านแล้วเข้าใจได้เป็นธรรมชาติ: ยกระดับคีย์ให้เป็นดัชนี เชื่อมข้อมูล แล้วนำคีย์กลับลงมาเป็นคอลัมน์ ทำให้ผู้อ่านโค้ดในภายหลังเข้าใจเจตนาได้ชัดเจน
orders_col = pd.DataFrame({'order_id': [1,2,3], 'customer_id': [10,20,10], 'amount': [100,200,150]})
cust_col = pd.DataFrame({'customer_id': [10,20], 'name': ['Alice','Bob']})
result = (
orders_col.set_index('customer_id')
.join(cust_col.set_index('customer_id'), how='left')
.reset_index()
)
print(result)การจัดแนว Series ให้ตรงกับดัชนีของ DataFrame
Series ก็มีดัชนีเช่นกัน และคุณสามารถเพิ่ม Series เป็นคอลัมน์ใหม่ให้กับ DataFrame ได้ด้วยการกำหนดค่า โดย Pandas จะจัดแนวค่าของ Series ให้ตรงกับป้ายกำกับดัชนีที่ตรงกันโดยอัตโนมัติ นี่เป็นรูปแบบการเชื่อมตามดัชนีที่เรียบง่าย เหมาะเมื่อคุณต้องการเพิ่มคอลัมน์เดียวจาก Series โดยไม่ต้องเรียกใช้ merge() หรือ join()
df = pd.DataFrame({'sales': [100, 200, 150]}, index=['A', 'B', 'C'])
tax_rate = pd.Series({'A': 0.1, 'B': 0.2, 'C': 0.15})
# Index alignment: Series aligns to DataFrame index automatically
df['tax'] = df['sales'] * tax_rate
print(df)
# sales tax
# A 100 10.0
# B 200 40.0
# C 150 22.5ประสิทธิภาพของการเชื่อมตามดัชนี
การเชื่อมบน ดัชนีที่เรียงลำดับแล้ว เร็วกว่าการเชื่อมบนคอลัมน์ปกติ เพราะ Pandas ใช้การค้นหาแบบทวิภาคกับดัชนีที่เรียงลำดับแล้ว หากคุณเชื่อมข้อมูลด้วยคีย์เดิมซ้ำ ๆ ให้กำหนดคีย์นั้นเป็นดัชนีตั้งแต่ต้นของกระบวนการทำงาน วิธีนี้สำคัญเป็นพิเศษในกระบวนการทำงานกับอนุกรมเวลา ซึ่งคุณเชื่อมด้วย DatetimeIndex หลายพันครั้งกับไฟล์จำนวนมาก
# Sort index before repeated joins for speed
left = left.sort_index()
right = right.sort_index()
# Both sorted -> Pandas uses merge path with binary search
result = left.join(right, how='inner')
# Check if index is sorted
print('Left sorted:', left.index.is_monotonic_increasing)
print('Right sorted:', right.index.is_monotonic_increasing)ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับการเชื่อมตามดัชนีจากบทเรียนนี้
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า DataFrame.join() เชื่อมตาม ดัชนีเป็นค่าเริ่มต้น โดยใช้การเชื่อมด้านซ้าย; pd.merge() ที่ใช้ left_index=True/right_index=True ให้การควบคุมที่มากกว่า; คุณสามารถเชื่อม DataFrames หลายรายการพร้อมกัน ได้ด้วยการส่งรายการให้กับ join(); และการใช้ ดัชนีที่เรียงลำดับแล้ว ช่วยเพิ่มประสิทธิภาพการเชื่อม บทถัดไปเราจะสำรวจการปรับรูปแบบ DataFrames ด้วย pivot_table
คำถามที่พบบ่อย
บทเรียน “การเชื่อมตามดัชนี” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การเชื่อมตามดัชนี” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การเชื่อมตามดัชนี”
ใช้ DataFrame.join() และกำหนด left_index/right_index=True ใน merge() เพื่อรวม DataFrames ที่จัดแนวตามดัชนี คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การเชื่อมตามดัชนี” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม
ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- pd.concat สำหรับการซ้อน DataFrames
- pd.merge: การเชื่อมแบบด้านในและด้านนอก
- การเชื่อมด้านซ้ายและด้านขวา
- การเชื่อมตามดัชนี