การเรียงลำดับตามดัชนี
จัดเรียงแถวใหม่ตามป้ายกำกับดัชนีด้วย sort_index() และทำความเข้าใจว่าเมื่อใดดัชนีที่เรียงแล้วช่วยเพิ่มประสิทธิภาพ
การเรียงลำดับตามดัชนี เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
ทำความเข้าใจดัชนีของ DataFrame
DataFrame ของ Pandas ทุกชุดมีดัชนีแถว ซึ่งเป็นชุดป้ายกำกับที่ใช้ระบุและเข้าถึงแถว โดยค่าเริ่มต้นจะเป็น RangeIndex (0, 1, 2, …) แต่คุณสามารถกำหนดให้เป็นคอลัมน์ใดก็ได้ (วันที่ ชื่อ หรือ ID) โดยใช้ set_index() เมื่อดัชนีมีความหมาย (เช่น DatetimeIndex หรือ ID ของลูกค้า) การเรียงตามดัชนีแทนค่าคอลัมน์จะทำให้ผลลัพธ์มีการจัดระเบียบตามตรรกะมากกว่า
import pandas as pd
df = pd.DataFrame(
{'value': [10, 20, 30]},
index=['C', 'A', 'B'] # out-of-order alphabetic index
)
print(df)
# value
# C 10
# A 20
# B 30sort_index() — จากน้อยไปมาก
DataFrame.sort_index() จะจัดลำดับแถวใหม่ตามป้ายกำกับดัชนี แทนที่จะตามค่าคอลัมน์ โดยค่าเริ่มต้นจะเรียงจากน้อยไปมาก — เรียงตามตัวอักษรสำหรับดัชนีสตริง ตามตัวเลขสำหรับดัชนีจำนวนเต็ม และตามลำดับเวลาสำหรับ DatetimeIndex วิธีนี้เป็นมาตรฐานสำหรับคืนชุดข้อมูลให้กลับสู่ลำดับตามธรรมชาติหลังจากสลับลำดับหรือเพิ่มระเบียนที่ไม่เรียงตามลำดับ
import pandas as pd
df = pd.DataFrame(
{'temp': [22.5, 19.0, 25.1, 18.3]},
index=pd.to_datetime(['2024-03-01', '2024-01-15', '2024-06-10', '2024-01-01'])
)
sorted_df = df.sort_index()
print(sorted_df)
# temp
# 2024-01-01 18.3
# 2024-01-15 19.0
# 2024-03-01 22.5
# 2024-06-10 25.1sort_index() จากมากไปน้อย
ส่ง ascending=False เพื่อเรียงดัชนีจากค่ามากที่สุด (หรือล่าสุด) ไปยังค่าน้อยที่สุด (หรือเก่าที่สุด) สำหรับ DatetimeIndex วิธีนี้จะวางข้อมูลล่าสุดไว้ด้านบน ซึ่งเป็นรูปแบบทั่วไปสำหรับข้อมูลการเงิน ไฟล์บันทึก และกระแสเหตุการณ์ที่เหตุการณ์ล่าสุดมีความเกี่ยวข้องมากที่สุด
import pandas as pd
df = pd.DataFrame(
{'price': [100, 110, 105, 115]},
index=pd.to_datetime(['2024-01', '2024-02', '2024-03', '2024-04'])
)
# Most recent first
print(df.sort_index(ascending=False))
# price
# 2024-04-30 115
# 2024-03-31 105
# 2024-02-29 110
# 2024-01-31 100การเรียงป้ายกำกับคอลัมน์ด้วย axis=1
โดยค่าเริ่มต้น sort_index() จะเรียงดัชนีแถว (axis=0) ให้ส่ง axis=1 เพื่อเรียงป้ายกำกับคอลัมน์ตามตัวอักษรแทน วิธีนี้มีประโยชน์สำหรับทำให้ DataFrames แบบกว้างที่มีหลายคอลัมน์เป็นมาตรฐานเดียวกัน เพื่อให้คอลัมน์ปรากฏตามลำดับตัวอักษรที่คาดเดาได้ และช่วยให้ค้นหาคอลัมน์หรือเปรียบเทียบ DataFrames ด้วยสายตาได้ง่ายขึ้น
import pandas as pd
df = pd.DataFrame({
'zebra': [1], 'apple': [2], 'mango': [3], 'banana': [4]
})
print('Before:', df.columns.tolist())
# ['zebra', 'apple', 'mango', 'banana']
sorted_cols = df.sort_index(axis=1)
print('After:', sorted_cols.columns.tolist())
# ['apple', 'banana', 'mango', 'zebra']ดัชนีที่เรียงลำดับแล้วเร็วขึ้นเมื่อใด
Pandas สามารถใช้การค้นหาแบบทวิภาคเพื่อค้นหาป้ายกำกับได้เมื่อดัชนีเรียงลำดับแล้ว (เพิ่มขึ้นแบบโมโนโทนิก) ดัชนีที่เรียงแล้วทำให้การตัดช่วง .loc['2024-01':'2024-06'] ใช้เวลา O(log n) แทน O(n) เมธอด is_monotonic_increasing (หรือ is_monotonic_decreasing) จะส่งคืนค่าบูลีนที่ระบุว่าดัชนีเรียงลำดับอยู่แล้วหรือไม่ การเรียงดัชนีขนาดใหญ่ก่อนตัดช่วงซ้ำ ๆ จึงเป็นต้นทุนครั้งเดียวที่คุ้มค่า
import pandas as pd
import numpy as np
idx = pd.to_datetime(['2024-03-01', '2024-01-15', '2024-06-10'])
df = pd.DataFrame({'v': [1, 2, 3]}, index=idx)
print('Sorted?', df.index.is_monotonic_increasing) # False
df = df.sort_index()
print('Sorted?', df.index.is_monotonic_increasing) # True
# Now slicing is efficient
print(df.loc['2024-01':'2024-03'])sort_index() กับ MultiIndex
เมื่อ DataFrame มีMultiIndex (ดัชนีแถวแบบลำดับชั้น) sort_index() จะเรียงทุกระดับในลำดับชั้นโดยค่าเริ่มต้น คุณสามารถจำกัดการเรียงให้เหลือเฉพาะบางระดับได้ด้วยพารามิเตอร์ level MultiIndex ที่เรียงลำดับแล้วจำเป็นต่อการตัดข้อมูลตามลำดับชั้นด้วย .loc[(outer, inner), :] อย่างมีประสิทธิภาพ
import pandas as pd
arrays = [
['B', 'B', 'A', 'A'],
['two', 'one', 'two', 'one']
]
idx = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])
df = pd.DataFrame({'value': [10, 20, 30, 40]}, index=idx)
print(df.sort_index())
# value
# first second
# A one 40
# two 30
# B one 20
# two 10การเรียงลำดับเพียงระดับเดียวของ MultiIndex
เมื่อใช้ MultiIndex คุณอาจต้องการเรียงเฉพาะระดับด้านในหรือด้านนอก โดยคงลำดับของอีกระดับหนึ่งไว้ ให้ส่ง level= ให้กับ sort_index() ซึ่งรับจำนวนเต็ม (ตำแหน่งระดับ) สตริง (ชื่อระดับ) หรือรายการได้ วิธีนี้มีประโยชน์เมื่อลำดับระดับด้านนอกถูกต้องอยู่แล้ว และคุณต้องการเรียงลำดับเฉพาะภายในแต่ละกลุ่ม
import pandas as pd
df = pd.DataFrame({
'sales': [300, 100, 200, 400, 150, 250]
}, index=pd.MultiIndex.from_tuples([
('Eng', 'Dave'), ('Eng', 'Alice'), ('Eng', 'Bob'),
('HR', 'Zoe'), ('HR', 'Carol'), ('HR', 'Eve')
], names=['dept', 'name']))
# Sort only the 'name' level alphabetically within each dept
print(df.sort_index(level='name'))
# sales
# dept name
# Eng Alice 100
# Bob 200
# Dave 300
# HR Carol 150
# Eve 250
# Zoe 400ความแตกต่างระหว่าง sort_index() และ sort_values()
สิ่งสำคัญคือต้องแยกความแตกต่างระหว่างเมธอดการเรียงลำดับทั้งสองแบบ sort_values(by='col') จะจัดลำดับแถวใหม่ตาม ค่าข้อมูล ในคอลัมน์ ส่วน sort_index() จะจัดลำดับแถวใหม่ตาม ป้ายกำกับแถว (ดัชนี) ซึ่งอาจสอดคล้องหรือไม่สอดคล้องกับคอลัมน์ใด ๆ ก็ได้ เมื่อดัชนีเป็นตัวระบุหลัก (เช่น DatetimeIndex หรือคีย์สตริงที่มีความหมาย) sort_index() คือตัวเลือกที่เหมาะสม
import pandas as pd
df = pd.DataFrame(
{'value': [30, 10, 20]},
index=['C', 'A', 'B']
)
# sort_index: sorted by row label A, B, C
print(df.sort_index())
# value
# A 10
# B 20
# C 30
# sort_values: sorted by data value 10, 20, 30
print(df.sort_values('value'))
# value
# A 10
# B 20
# C 30
# (same here because values happen to match alphabetical label order!)การคืนลำดับเดิมหลังการดำเนินการ
การดำเนินการบางอย่าง (เช่น การสับเปลี่ยนลำดับ หรือการสุ่มตัวอย่างด้วย df.sample(frac=1)) จะทำให้ลำดับแถวสับสน sort_index() เป็นวิธีที่เป็นระเบียบในการคืนลำดับต่อเนื่องเดิม หากลำดับเดิมเป็น RangeIndex (0, 1, 2, …) sort_index() จะคืนลำดับนั้น หากเป็นป้ายกำกับที่มีความหมาย เมธอดนี้จะคืนการเรียงตามธรรมชาติของป้ายกำกับดังกล่าว
import pandas as pd
df = pd.DataFrame({'x': [10, 20, 30, 40, 50]})
# Shuffle (random sample)
shuffled = df.sample(frac=1, random_state=42)
print('Shuffled index:', shuffled.index.tolist())
# e.g. [2, 4, 0, 1, 3]
# Restore original order by sorting the index
restored = shuffled.sort_index()
print('Restored index:', restored.index.tolist())
# [0, 1, 2, 3, 4]sort_index() กับ na_position
เช่นเดียวกับ sort_values() sort_index() ยังรองรับ na_position สำหรับควบคุมตำแหน่งที่ป้ายกำกับดัชนีซึ่งเป็น NaN จะปรากฏขึ้น ซึ่งมีความสำคัญเมื่อ DataFrame มีดัชนีเป็นสตริงหรือวันที่ที่มีป้ายกำกับ NaN อยู่บางส่วน (อาจเกิดขึ้นหลังการดำเนินการที่ทำให้ค่าดัชนีบางส่วนหายไป) ค่าเริ่มต้นคือ 'last'
import pandas as pd
import numpy as np
df = pd.DataFrame(
{'v': [1, 2, 3, 4]},
index=['B', None, 'A', 'C']
)
print(df.sort_index(na_position='last'))
# v
# A 3
# B 1
# C 4
# NaN 2การวัดประโยชน์ด้านประสิทธิภาพ
คุณสามารถวัดประโยชน์ด้านประสิทธิภาพของดัชนีที่เรียงลำดับแล้วจากการทดลองได้ โดยใช้ timeit ของ Python เพื่อเปรียบเทียบการเลือกช่วงข้อมูลบน DatetimeIndex ที่ยังไม่ได้เรียงลำดับกับที่เรียงลำดับแล้ว กรณีที่เรียงลำดับแล้วจะใช้การค้นหาแบบทวิภาค และโดยทั่วไปจะเร็วกว่า 5–20 เท่าสำหรับ DataFrame ขนาดใหญ่ สิ่งนี้แสดงให้เห็นว่า sort_index() ไม่ใช่เพียงการจัดรูปแบบให้ดูดีเท่านั้น แต่ยังส่งผลจริงต่อเวลาทำงานด้วย
import pandas as pd
import numpy as np
np.random.seed(0)
random_dates = pd.to_datetime(
pd.Timestamp('2020-01-01').value + np.random.randint(0, 1_000_000_000_000_000, size=100_000),
unit='ns'
)
df = pd.DataFrame({'val': np.random.randn(100_000)}, index=random_dates)
# Without sort: O(n) scan
import timeit
t1 = timeit.timeit(lambda: df.loc['2022-01':'2022-06'], number=100)
df_sorted = df.sort_index()
t2 = timeit.timeit(lambda: df_sorted.loc['2022-01':'2022-06'], number=100)
print(f'Unsorted: {t1:.3f}s, Sorted: {t2:.3f}s, Speedup: {t1/t2:.1f}x')ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจของคุณเกี่ยวกับการเรียงลำดับตามดัชนีใน Pandas
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า sort_index() จะจัดลำดับแถวใหม่ตามป้ายกำกับของแถว (ไม่ใช่ค่าของคอลัมน์), axis=1 จะเรียงป้ายกำกับคอลัมน์ตามตัวอักษร และ ดัชนีที่เรียงลำดับแล้วช่วยให้ค้นหาแบบทวิภาคได้ ทำให้การเลือกช่วงข้อมูลตามเวลารวดเร็วขึ้นมาก สำหรับ DataFrame ที่มี MultiIndex ให้ใช้ level= เพื่อจำกัดการเรียงลำดับไว้ที่ระดับใดระดับหนึ่งของลำดับชั้น ควรตรวจสอบ is_monotonic_increasing เสมอก่อนอาศัยการค้นหาช่วงข้อมูลที่มีประสิทธิภาพ บทถัดไปเราจะจัดอันดับค่าภายในคอลัมน์
คำถามที่พบบ่อย
บทเรียน “การเรียงลำดับตามดัชนี” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การเรียงลำดับตามดัชนี” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การเรียงลำดับตามดัชนี”
จัดเรียงแถวใหม่ตามป้ายกำกับดัชนีด้วย sort_index() และทำความเข้าใจว่าเมื่อใดดัชนีที่เรียงแล้วช่วยเพิ่มประสิทธิภาพ คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การเรียงลำดับตามดัชนี” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม
ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเรียงลำดับตามค่าคอลัมน์
- การเรียงลำดับตามดัชนี
- การจัดอันดับค่า
- การกำหนดและรีเซ็ตดัชนี