การจัดแนวดัชนีและการสร้างดัชนีใหม่
จัดแนว DataFrames สองชุดให้ใช้ดัชนีร่วมกันด้วย reindex() เติมป้ายกำกับที่หายไป และทำความเข้าใจว่าการคำนวณจัดแนวดัชนีอย่างไร
การจัดแนวดัชนีและการสร้างดัชนีใหม่ เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
Pandas จัดแนวดัชนีอย่างไร
พฤติกรรมที่ทรงพลังที่สุดและบางครั้งก็น่าประหลาดใจของ Pandas อย่างหนึ่งคือการจัดแนวดัชนีโดยอัตโนมัติ เมื่อคุณบวก ลบ หรือรวม Series หรือ DataFrames สองรายการด้วยวิธีอื่น Pandas จะจัดแนวข้อมูลตามป้ายกำกับดัชนีก่อนดำเนินการ ป้ายกำกับที่ตรงกันจะถูกนำมาดำเนินการร่วมกัน ส่วนป้ายกำกับที่ไม่ตรงกันจะให้ผลเป็น NaN วิธีนี้ช่วยป้องกันข้อผิดพลาดเงียบ ๆ จากข้อมูลที่จัดแนวไม่ตรงกัน และทำให้สามารถรวมข้อมูลจากแหล่งต่าง ๆ ได้อย่างปลอดภัยโดยไม่ต้องจัดเรียงหรือเรียงลำดับใหม่ด้วยตนเองก่อน
import pandas as pd
s1 = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
s2 = pd.Series([1, 2, 3], index=['b', 'c', 'd'])
# Alignment in action: a→NaN, d→NaN
result = s1 + s2
print('s1 + s2 with automatic alignment:')
print(result)NaN จากดัชนีที่จัดแนวไม่ตรงกัน
เมื่อป้ายกำกับดัชนีไม่ตรงกัน Pandas จะเติมรายการที่ขาดหายด้วย NaN นี่เป็นพฤติกรรมที่ตั้งใจไว้ เพื่อสื่อว่า “ไม่มีค่าที่สอดคล้องกันจากตัวถูกดำเนินการรายการใดรายการหนึ่ง” ให้ตรวจสอบผลลัพธ์ของการคำนวณระหว่าง Series หรือ DataFrames สองรายการเสมอว่ามีค่า NaN ที่ไม่คาดคิดหรือไม่ เพราะค่าเหล่านี้บ่งชี้ว่าดัชนีจัดแนวไม่ตรงกัน ใช้ fill_value=0 ในเมธอดการคำนวณ (s1.add(s2, fill_value=0)) เพื่อให้ค่าที่ขาดหายหลังการจัดแนวถูกถือเป็นศูนย์ แทนที่จะทำให้ NaN แพร่ต่อไป
import pandas as pd
s1 = pd.Series({'a': 10, 'b': 20, 'c': 30})
s2 = pd.Series({'b': 1, 'c': 2, 'd': 3})
# Default: NaN where labels don't match
print('Default (NaN for unmatched):')
print(s1 + s2)
# fill_value=0: treat missing as zero
print('\nWith fill_value=0:')
print(s1.add(s2, fill_value=0))การจัดแนวการคำนวณของ DataFrame
การจัดแนวมีผลกับทั้งแถวและคอลัมน์เมื่อรวม DataFrames สองรายการ ผลลัพธ์จะมียูเนียนของชุดดัชนีทั้งสองและชุดคอลัมน์ทั้งสอง โดยมี NaN ในตำแหน่งที่ DataFrame รายการใดรายการหนึ่งไม่มีค่า ซึ่งเทียบเท่ากับการเชื่อมแบบภายนอกทั้งหมดบนดัชนีและคอลัมน์พร้อมกัน นั่นหมายความว่าคุณสามารถบวก DataFrames จากช่วงปีบัญชีที่แตกต่างกันได้อย่างปลอดภัย เดือนที่มีอยู่ในรายการหนึ่งแต่ไม่มีในอีกรายการจะกลายเป็น NaN ซึ่งคุณสามารถเติมค่าหรือลบออกภายหลังได้
import pandas as pd
df1 = pd.DataFrame({'revenue': [100, 200], 'cost': [80, 150]}, index=['Jan', 'Feb'])
df2 = pd.DataFrame({'revenue': [120, 210], 'headcount': [5, 6]}, index=['Feb', 'Mar'])
result = df1 + df2
print('Combined DataFrame (union of index and columns):')
print(result)เมธอด reindex()
df.reindex(new_index) จะส่งคืน DataFrame ใหม่ที่ปรับให้สอดคล้องกับรายการป้ายกำกับ new_index ป้ายกำกับที่มีอยู่ทั้งในดัชนีเดิมและดัชนีใหม่จะถูกคงไว้ ป้ายกำกับที่มีใน new_index แต่ไม่มีในดัชนีเดิมจะได้ค่าเป็น NaN ส่วนป้ายกำกับที่มีในดัชนีเดิมแต่ไม่มีใน new_index จะถูกลบออก นี่คือวิธีที่ชัดเจนในการจัดแนว DataFrame ให้ตรงกับชุดป้ายกำกับเป้าหมายก่อนดำเนินการ
import pandas as pd
s = pd.Series({'a': 10, 'b': 20, 'c': 30})
# Reindex to a new label set
reindexed = s.reindex(['b', 'c', 'd', 'e'])
print('Original:', s.index.tolist())
print('New index: [b, c, d, e]')
print('\nReindexed Series:')
print(reindexed)
# b, c preserved; d, e → NaN; a droppedการเติมค่าที่ขาดหายหลังทำดัชนีใหม่
reindex() ยอมรับพารามิเตอร์ fill_value เพื่อแทนที่ป้ายกำกับใหม่ด้วยค่าคงที่ และพารามิเตอร์ method สำหรับการเติมไปข้างหน้า ('ffill') หรือการเติมย้อนกลับ ('bfill') วิธีเติมเหล่านี้มีประโยชน์มากที่สุดสำหรับข้อมูลอนุกรมเวลาที่คุณทำดัชนีใหม่ให้กับ Series ตามช่วงวันที่ที่ครบถ้วน และต้องการเติมวันที่ขาดหายด้วยค่าล่าสุดที่ทราบ แทนที่จะเป็น NaN
import pandas as pd
# Sparse daily data with gaps
s = pd.Series(
[10, 20, 30],
index=pd.to_datetime(['2024-01-01', '2024-01-03', '2024-01-07'])
)
# Reindex to complete date range
full_range = pd.date_range('2024-01-01', '2024-01-07')
print('Forward fill (carry last known value):')
print(s.reindex(full_range, method='ffill'))
print('\nFill with 0:')
print(s.reindex(full_range, fill_value=0))การทำดัชนีใหม่ให้คอลัมน์
reindex ใช้กับคอลัมน์ได้เช่นกัน: df.reindex(columns=['col1', 'col2', 'new_col']) คอลัมน์ใหม่ที่ไม่มีอยู่ใน DataFrame เดิมจะถูกเพิ่มเข้ามาโดยมีค่าเป็น NaN คอลัมน์เดิมที่ไม่อยู่ในลิสต์ใหม่จะถูกลบออก วิธีนี้มีประโยชน์สำหรับการบังคับใช้โครงสร้างคอลัมน์มาตรฐานเดียวกันกับ DataFrames หลายรายการที่มาจากแหล่งต่างกันและอาจมีชุดคอลัมน์ไม่เหมือนกัน
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob'],
'age': [30, 25],
'city': ['NY', 'LA']
})
# Enforce a canonical column order and add missing columns
canonical_cols = ['name', 'age', 'email', 'city', 'country']
df_reindexed = df.reindex(columns=canonical_cols)
print(df_reindexed)
# 'email' and 'country' are new → NaNการใช้ align() เพื่อทำให้ออบเจกต์สองรายการสอดคล้องกัน
s1.align(s2) จะส่งคืนออบเจกต์ใหม่สองรายการที่มีดัชนีเดียวกัน (ยูเนียนหรืออินเตอร์เซกชันตามพารามิเตอร์ join) ทำให้พร้อมสำหรับการดำเนินการแบบสมาชิกต่อสมาชิก ซึ่งเทียบเท่ากับการทำดัชนีใหม่ให้ออบเจกต์ทั้งสองพร้อมกันเพื่อให้ใช้ชุดป้ายกำกับเดียวกัน ใช้ join='inner' เพื่อเก็บเฉพาะป้ายกำกับที่มีร่วมกัน หรือใช้ join='outer' (ค่าเริ่มต้น) เพื่อเก็บป้ายกำกับทั้งหมดจากทั้งสองรายการ โดยใช้ NaN สำหรับรายการที่ไม่ตรงกัน
import pandas as pd
s1 = pd.Series({'a': 10, 'b': 20, 'c': 30})
s2 = pd.Series({'b': 1, 'c': 2, 'd': 3})
# Align to common labels only (inner join)
s1_aligned, s2_aligned = s1.align(s2, join='inner')
print('Inner-aligned s1:')
print(s1_aligned)
print('Inner-aligned s2:')
print(s2_aligned)
print('\nProduct on common labels:')
print(s1_aligned * s2_aligned)การจัดแนวในการ merge เทียบกับการคำนวณ
Pandas มีแนวคิดสองแบบสำหรับการรวม DataFrames: merge/join (รูปแบบ SQL ซึ่งจับคู่คีย์อย่างชัดเจน) และการคำนวณโดยจัดแนวดัชนี (โดยนัยและอิงตามป้ายกำกับ) ใช้ merge เมื่อต้องการรวมตารางที่มีโครงสร้างและคอลัมน์คีย์ชัดเจน ใช้การจัดแนวสำหรับการคำนวณระหว่าง DataFrames ที่ควรใช้ดัชนีร่วมกันตามธรรมชาติ เช่น การลบ DataFrame ต้นทุนออกจาก DataFrame รายรับ ซึ่งทั้งคู่จัดทำดัชนีตาม (ภูมิภาค, เดือน)
import pandas as pd
# Two DataFrames sharing the same index
revenue = pd.Series({'North': 500, 'South': 300, 'East': 450})
costs = pd.Series({'North': 350, 'South': 280, 'West': 400})
# Automatic alignment: 'East' and 'West' don't match → NaN
profit = revenue - costs
print('Profit by region:')
print(profit)
# If you want only common regions
profit_inner = revenue.align(costs, join='inner')[0] - revenue.align(costs, join='inner')[1]
print('\nProfit (common regions only):')
print(profit_inner)การตรวจสอบความเท่ากันของดัชนีก่อนดำเนินการ
ก่อนดำเนินการกับ DataFrames สองรายการ ให้ตรวจสอบว่าดัชนีตรงกันหรือไม่ด้วย (df1.index == df2.index).all() หากดัชนีแตกต่างกันเพียงลำดับ ให้จัดเรียงทั้งสองรายการก่อนเปรียบเทียบ สำหรับ DataFrames ที่โหลดมาจากแหล่งต่างกัน แนวทางที่ดีคือจัดแนวหรือทำดัชนีใหม่อย่างชัดเจนก่อนการคำนวณ เพื่อหลีกเลี่ยงการแพร่ต่อของ NaN โดยไม่ตั้งใจ โปรดบันทึกสมมติฐานเกี่ยวกับการจัดแนวไว้ในความคิดเห็นหรือบันทึกของกระบวนการทำงาน
import pandas as pd
df1 = pd.DataFrame({'sales': [100, 200, 300]}, index=['Q1', 'Q2', 'Q3'])
df2 = pd.DataFrame({'cost': [80, 160, 240]}, index=['Q1', 'Q2', 'Q3'])
# Check index equality
if (df1.index == df2.index).all():
print('Indices match — safe to combine.')
combined = pd.concat([df1, df2], axis=1)
combined['profit'] = combined['sales'] - combined['cost']
print(combined)
else:
print('Indices differ — align before combining!')รูปแบบเชิงปฏิบัติ: การทำให้รูปร่างเป็นมาตรฐาน
รูปแบบที่พบบ่อยเมื่อโหลดข้อมูลจากไฟล์หลายไฟล์หรือการเรียก API หลายครั้งคือ แต่ละชุดครอบคลุมคีย์คนละส่วน ก่อนนำมาต่อหรือรวมข้อมูล ให้ทำดัชนีใหม่ของทุกชุดให้ครอบคลุมขอบเขตคีย์ทั้งหมดที่ทราบด้วย fill_value=0 วิธีนี้ทำให้ทุกชุดมีรูปร่างเหมือนกัน (ดัชนีเดียวกันและคอลัมน์เดียวกัน) ก่อนดำเนินการ และช่วยป้องกันรูปร่างข้อมูลไม่ตรงกันแบบเงียบ ๆ ซึ่งอาจทำให้ผลลัพธ์รวมไม่ถูกต้อง
import pandas as pd
# Two sales batches with different product sets
batch1 = pd.Series({'laptop': 50, 'phone': 80, 'tablet': 30})
batch2 = pd.Series({'phone': 90, 'tablet': 40, 'headphones': 60})
# Full product catalogue
all_products = ['laptop', 'phone', 'tablet', 'headphones']
# Standardise both to the full catalogue
b1 = batch1.reindex(all_products, fill_value=0)
b2 = batch2.reindex(all_products, fill_value=0)
total = b1 + b2
print('Total sales per product:')
print(total)กรณีขอบของการจัดแนวดัชนี
กรณีขอบสำคัญสองกรณี ได้แก่ ป้ายกำกับซ้ำ — หากทั้งสอง Series มีป้ายกำกับดัชนีซ้ำกัน การจัดแนวจะทำให้ข้อมูลขยายตัวในลักษณะคล้ายผลคูณคาร์ทีเซียนและมีค่า NaN จำนวนมาก (แพนด้าส์จะไม่คาดเดาว่ารายการที่ซ้ำกันรายการใดตรงกัน) ควรตรวจสอบให้ดัชนีไม่ซ้ำกันเสมอก่อนจัดแนวเพื่อคำนวณ และ ดัชนีจำนวนเต็มกับดัชนีชนิดออบเจ็กต์ — RangeIndex(0,5) และ Int64Index([0,1,2,3,4]) อาจจัดแนวได้ไม่สมบูรณ์หลังการดำเนินการ เนื่องจากชนิดหนึ่งถูกอนุมานขึ้นมา ส่วนอีกชนิดระบุไว้อย่างชัดเจน ใช้ reset_index(drop=True) เพื่อทำให้เป็นมาตรฐานเดียวกัน
import pandas as pd
# Duplicate label alignment — produces unexpected expansion
s1 = pd.Series([1, 2, 3], index=['a', 'a', 'b'])
s2 = pd.Series([10, 20], index=['a', 'b'])
result = s1 + s2
print('Result with duplicate indices (unexpected expansion):')
print(result)
print('\nAlways ensure unique indices before arithmetic!')ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับการจัดแนวดัชนีและการจัดดัชนีใหม่จากบทเรียนนี้
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า แพนด้าส์จะทำ การจัดแนวดัชนีอัตโนมัติกับการคำนวณทางคณิตศาสตร์ โดยสร้างค่า NaN สำหรับป้ายกำกับที่ไม่ตรงกัน การจัดดัชนีใหม่จะปรับ DataFrame ให้สอดคล้องกับชุดป้ายกำกับเป้าหมาย พร้อมตัวเลือกเติมค่าสำหรับป้ายกำกับที่ขาดหาย และการจัดแนวจะทำให้ออบเจ็กต์สองรายการมีดัชนีเดียวกันพร้อมกัน ต่อไปเราจะสำรวจประโยชน์ด้านประสิทธิภาพของดัชนีที่เรียงลำดับแล้ว และวิธีวัดผลด้วย timeit
คำถามที่พบบ่อย
บทเรียน “การจัดแนวดัชนีและการสร้างดัชนีใหม่” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การจัดแนวดัชนีและการสร้างดัชนีใหม่” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การจัดแนวดัชนีและการสร้างดัชนีใหม่”
จัดแนว DataFrames สองชุดให้ใช้ดัชนีร่วมกันด้วย reindex() เติมป้ายกำกับที่หายไป และทำความเข้าใจว่าการคำนวณจัดแนวดัชนีอย่างไร คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การจัดแนวดัชนีและการสร้างดัชนีใหม่” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม
ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การสร้าง MultiIndex
- การเลือกข้อมูลจาก MultiIndex
- การจัดแนวดัชนีและการสร้างดัชนีใหม่
- ประโยชน์ด้านประสิทธิภาพของดัชนีที่เรียงแล้ว