0Pricing
Pandas & NumPy Academy · บทเรียน

การเรียงลำดับตามค่าคอลัมน์

เรียงลำดับ 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     65

sort_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             3

inplace=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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การเรียงลำดับตามค่าคอลัมน์
  2. การเรียงลำดับตามดัชนี
  3. การจัดอันดับค่า
  4. การกำหนดและรีเซ็ตดัชนี
← กลับไปที่ Pandas & NumPy Academy