การเรียงลำดับตามค่าคอลัมน์
เรียงลำดับ DataFrame ตามคอลัมน์หนึ่งคอลัมน์หรือหลายคอลัมน์ด้วย sort_values() ควบคุมลำดับจากน้อยไปมากหรือจากมากไปน้อย และจัดการตำแหน่งของ NaN
การเรียงลำดับตามค่าคอลัมน์ เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดการเรียงลำดับจึงสำคัญ
การเรียงลำดับ DataFrame มีความสำคัญต่อการนำเสนอ (รายงานอันดับสูงสุด N รายการ กระดานจัดอันดับ) ความถูกต้อง (การดำเนินการกับอนุกรมเวลาต้องใช้ลำดับตามเวลา) และประสิทธิภาพ (การค้นหาแบบทวิภาคบนดัชนีที่เรียงลำดับแล้วใช้เวลา O(log n) เทียบกับ O(n)) เมธอด sort_values() ของ Pandas เป็นเครื่องมือหลักสำหรับเรียงลำดับตามเนื้อหาของคอลัมน์ และจะส่งคืน DataFrame ใหม่โดยไม่แก้ไขข้อมูลเดิม
import pandas as pd
df = pd.DataFrame({
'name': ['Dave', 'Alice', 'Carol', 'Bob'],
'score': [75, 92, 88, 65]
})
# Sort by score descending (highest first)
ranked = df.sort_values('score', ascending=False)
print(ranked)
# name score
# 1 Alice 92
# 2 Carol 88
# 0 Dave 75
# 3 Bob 65sort_values() — การใช้งานพื้นฐาน
DataFrame.sort_values(by) จะเรียงแถวตามค่าในคอลัมน์ที่ระบุ อาร์กิวเมนต์ by รับชื่อคอลัมน์เดียว (สตริง) หรือรายการชื่อคอลัมน์สำหรับการเรียงลำดับด้วยหลายคีย์ โดยค่าเริ่มต้นจะเรียงจากน้อยไปมาก (ค่าน้อยที่สุดก่อน) ให้ส่ง ascending=False เพื่อเรียงจากมากไปน้อย
import pandas as pd
df = pd.DataFrame({
'product': ['B', 'A', 'C', 'A', 'B'],
'price': [20, 10, 30, 15, 25]
})
# Ascending by price (default)
print(df.sort_values('price'))
# product price
# 1 A 10
# 3 A 15
# 0 B 20
# 4 B 25
# 2 C 30การเรียงลำดับตามหลายคอลัมน์
การส่งรายการชื่อคอลัมน์ให้กับ sort_values(by=) จะเรียงตามคอลัมน์แรก จากนั้นใช้คอลัมน์ที่สองเพื่อจัดลำดับแถวที่มีค่าเท่ากัน และทำเช่นนี้ต่อไป พารามิเตอร์ ascending สามารถเป็นรายการค่าบูลีนที่มีลำดับตรงกับคอลัมน์ ทำให้กำหนดทิศทางการเรียงลำดับที่ต่างกันสำหรับแต่ละคีย์ได้
import pandas as pd
df = pd.DataFrame({
'dept': ['HR', 'Eng', 'HR', 'Eng', 'Sales'],
'salary': [50000, 90000, 60000, 80000, 70000],
'name': ['Alice', 'Bob', 'Carol', 'Dave', 'Eve']
})
# Sort by dept A-Z, then by salary descending within each dept
sorted_df = df.sort_values(
by=['dept', 'salary'],
ascending=[True, False]
)
print(sorted_df)
# dept salary name
# 1 Eng 90000 Bob
# 3 Eng 80000 Dave
# 2 HR 60000 Carol
# 0 HR 50000 Alice
# 4 Sales 70000 Eveการจัดตำแหน่ง NaN ด้วย na_position
โดยค่าเริ่มต้น ค่า NaN จะถูกเรียงไว้ที่ท้ายผลลัพธ์เสมอ ไม่ว่าจะเรียงจากน้อยไปมากหรือมากไปน้อย ใช้พารามิเตอร์ na_position เพื่อควบคุมตำแหน่งนี้: 'last' (ค่าเริ่มต้น) หรือ 'first' การตัดสินใจว่าจะให้ NaN ปรากฏที่ใดมีความสำคัญในตารางจัดอันดับ เพราะค่าที่หายไปอาจหมายถึง 'ไม่ทราบ' และควรแยกออกจากรายการที่มีอันดับถูกต้องอย่างชัดเจน
import pandas as pd
import numpy as np
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Carol', 'Dave'],
'score': [92, np.nan, 88, np.nan]
})
# NaN last (default)
print(df.sort_values('score', ascending=False, na_position='last'))
# name score
# 0 Alice 92.0
# 2 Carol 88.0
# 1 Bob NaN
# 3 Dave NaN
# NaN first
print(df.sort_values('score', na_position='first').head(2))การเรียงลำดับแบบคงเสถียรภาพและพารามิเตอร์ kind=
Pandas ใช้การเรียงลำดับแบบคงเสถียรภาพเป็นค่าเริ่มต้น (mergesort ซึ่งมีความซับซ้อน O(n log n)) เมื่อสองแถวมีค่าในคีย์ที่ใช้เรียงเท่ากัน จะคงลำดับสัมพัทธ์เดิมของแถวเหล่านั้นไว้ ความเสถียรนี้สำคัญเมื่อคุณเรียงตามคีย์หลักก่อน แล้วจึงเรียงตามคีย์รอง เพราะลำดับของคีย์หลักจะยังคงอยู่ในกลุ่มที่ค่าคีย์รองเท่ากัน คุณสามารถเปลี่ยนอัลกอริทึมด้วย kind='quicksort' (เร็วกว่าแต่ไม่คงเสถียรภาพ) หรือ kind='heapsort'
import pandas as pd
df = pd.DataFrame({
'group': ['A', 'B', 'A', 'B'],
'value': [10, 10, 20, 20],
'original_row': [0, 1, 2, 3]
})
# Stable sort: equal values keep original relative order
result = df.sort_values('value', kind='mergesort')
print(result)
# group value original_row
# 0 A 10 0
# 1 B 10 1 <- row 0 before row 1 (stable)
# 2 A 20 2
# 3 B 20 3inplace=True เทียบกับการกำหนดค่าใหม่
เช่นเดียวกับเมธอดส่วนใหญ่ของ Pandas sort_values() จะส่งคืน DataFrame ใหม่โดยค่าเริ่มต้น การส่ง inplace=True จะแก้ไข DataFrame โดยตรงและส่งคืน None โดยทั่วไปไม่แนะนำให้ใช้ inplace ใน Pandas สมัยใหม่ เพราะทำให้การเชื่อมกระบวนการและการแก้จุดบกพร่องทำได้ยากขึ้น การกำหนดค่าใหม่เสมอจึงง่ายกว่า: df = df.sort_values('col')
import pandas as pd
df = pd.DataFrame({'x': [3, 1, 4, 1, 5]})
# Preferred: reassign
df = df.sort_values('x')
print(df['x'].tolist()) # [1, 1, 3, 4, 5]
# Alternative: inplace (not recommended for pipelines)
df2 = pd.DataFrame({'x': [3, 1, 4]})
df2.sort_values('x', inplace=True)
print(df2['x'].tolist()) # [1, 3, 4]การรีเซ็ตดัชนีหลังการเรียงลำดับ
หลังการเรียงลำดับ ดัชนีแถวจะยังสะท้อนตำแหน่งเดิม ในตารางที่เรียงจากมากไปน้อย แถว 0 อาจมีดัชนีเป็น 4 แล้ว ให้เรียกใช้ .reset_index(drop=True) เพื่อกำหนดดัชนีใหม่แบบต่อเนื่องโดยเริ่มจาก 0 ขั้นตอนนี้สำคัญก่อนใช้ .iloc[0] เพื่อรับแถวที่มีอันดับสูงสุดได้อย่างแน่นอน หรือก่อนส่งออกเป็นไฟล์ที่ช่องว่างของดัชนีอาจดูสับสน
import pandas as pd
df = pd.DataFrame({'score': [70, 90, 80]})
sorted_df = df.sort_values('score', ascending=False)
print(sorted_df)
# score
# 1 90
# 2 80
# 0 70
# Clean sequential index
reset_df = sorted_df.reset_index(drop=True)
print(reset_df)
# score
# 0 90
# 1 80
# 2 70การรับอันดับสูงสุด N รายการด้วย nlargest() และ nsmallest()
สำหรับการเลือกแถว N อันดับแรกหรือ N อันดับสุดท้ายตามค่าคอลัมน์ df.nlargest(n, 'col') และ df.nsmallest(n, 'col') มีประสิทธิภาพมากกว่าการเรียง DataFrame ทั้งหมดแล้วตัดบางส่วน ทั้งสองใช้การเรียงลำดับบางส่วน (การเลือกด้วยฮีป) ซึ่งมีความซับซ้อน O(n log k) แทนที่จะเป็น O(n log n) จึงมีความสำคัญกับ DataFrames ขนาดใหญ่
import pandas as pd
df = pd.DataFrame({
'product': ['A', 'B', 'C', 'D', 'E'],
'revenue': [5000, 12000, 8000, 3000, 15000]
})
# Top 3 by revenue
top3 = df.nlargest(3, 'revenue')
print(top3)
# product revenue
# 4 E 15000
# 1 B 12000
# 2 C 8000
# Bottom 2 by revenue
bottom2 = df.nsmallest(2, 'revenue')
print(bottom2)การเรียงลำดับคอลัมน์หมวดหมู่ตามลำดับหมวดหมู่
เมื่อเรียงลำดับคอลัมน์ที่มีชนิดข้อมูล Categorical ที่มีลำดับ sort_values() จะเคารพลำดับของหมวดหมู่แทนลำดับตัวอักษร ซึ่งจำเป็นต่อการเรียงระดับความสำคัญ ระดับความรุนแรง หรือป้ายกำกับขนาดอย่างถูกต้อง — 'Small' ควรอยู่ก่อน 'Medium' และ 'Large' ไม่ใช่เรียงตามตัวอักษรที่ทำให้ 'Large' อยู่ก่อน
import pandas as pd
df = pd.DataFrame({
'size': pd.Categorical(
['Large', 'Small', 'Medium', 'Small', 'Large'],
categories=['Small', 'Medium', 'Large'],
ordered=True
),
'count': [10, 5, 8, 3, 7]
})
print(df.sort_values('size'))
# size count
# 1 Small 5
# 3 Small 3
# 2 Medium 8
# 0 Large 10
# 4 Large 7การเชื่อมการเรียงลำดับกับการดำเนินการอื่น
เนื่องจาก sort_values() ส่งคืน DataFrame จึงสามารถทำงานร่วมกับการเชื่อมเมธอดได้อย่างเป็นธรรมชาติ รูปแบบทั่วไปคือ กรองแถว → รวมข้อมูล → เรียงลำดับ → แสดง N อันดับแรก การเชื่อมเมธอดช่วยให้กระบวนการแปลงข้อมูลเป็นเส้นตรงและอ่านง่าย
import pandas as pd
df = pd.DataFrame({
'dept': ['Eng', 'HR', 'Eng', 'Sales', 'HR', 'Eng'],
'salary': [90000, 50000, 120000, 70000, 55000, 80000]
})
result = (
df
.groupby('dept')['salary'].mean()
.reset_index()
.sort_values('salary', ascending=False)
.head(2)
)
print(result)
# dept salary
# 0 Eng 96666.67
# 2 Sales 70000.00ภาคปฏิบัติ: รายงานผลิตภัณฑ์ 5 อันดับแรก
ต่อไปนี้คือตัวอย่างการสร้างรายงานผลิตภัณฑ์ 5 อันดับแรกตามรายได้ตั้งแต่ต้นจนจบ: โหลดข้อมูล คำนวณรายได้รวมต่อผลิตภัณฑ์ เรียงจากมากไปน้อย เลือก 5 อันดับแรก รีเซ็ตดัชนีเพื่อสร้างหมายเลขอันดับที่เรียบร้อย และเพิ่มคอลัมน์อันดับสำหรับแสดงผล
import pandas as pd
orders = pd.DataFrame({
'product': ['A', 'B', 'A', 'C', 'B', 'D', 'E', 'A', 'C', 'E'],
'revenue': [100, 200, 150, 80, 300, 60, 400, 120, 90, 350]
})
top5 = (
orders
.groupby('product')['revenue'].sum()
.reset_index()
.sort_values('revenue', ascending=False)
.head(5)
.reset_index(drop=True)
)
top5.index = top5.index + 1 # rank from 1
top5.index.name = 'rank'
print(top5)ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจเกี่ยวกับการเรียงลำดับ DataFrames ตามค่าคอลัมน์
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า sort_values(by=) ใช้เรียงลำดับตามคอลัมน์หนึ่งคอลัมน์หรือหลายคอลัมน์ ascending= สามารถเป็นรายการเพื่อกำหนดทิศทางที่ต่างกันสำหรับแต่ละคีย์ na_position='last' ใช้ควบคุมตำแหน่งของ NaN และ nlargest()/nsmallest() ใช้ดึงแถว N อันดับแรกหรือสุดท้ายได้อย่างมีประสิทธิภาพโดยไม่ต้องเรียง DataFrame ทั้งหมด หลังเรียงลำดับ ให้ใช้ reset_index() เสมอเพื่อให้ผลลัพธ์เป็นลำดับต่อเนื่องที่เรียบร้อย บทถัดไป เราจะเรียงลำดับตามดัชนีของ DataFrame
คำถามที่พบบ่อย
บทเรียน “การเรียงลำดับตามค่าคอลัมน์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การเรียงลำดับตามค่าคอลัมน์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การเรียงลำดับตามค่าคอลัมน์”
เรียงลำดับ DataFrame ตามคอลัมน์หนึ่งคอลัมน์หรือหลายคอลัมน์ด้วย sort_values() ควบคุมลำดับจากน้อยไปมากหรือจากมากไปน้อย และจัดการตำแหน่งของ NaN คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การเรียงลำดับตามค่าคอลัมน์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม
ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเรียงลำดับตามค่าคอลัมน์
- การเรียงลำดับตามดัชนี
- การจัดอันดับค่า
- การกำหนดและรีเซ็ตดัชนี