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

การจัดอันดับค่า

กำหนดอันดับให้ค่าของคอลัมน์ด้วย rank() เลือกวิธีจัดการค่าที่มีอันดับเท่ากัน และสร้างช่วงเปอร์เซ็นไทล์ด้วย pd.cut()

การจัดอันดับค่า เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

การจัดอันดับคืออะไร

การจัดอันดับ จะกำหนดตำแหน่งให้แต่ละค่าใน Series ตามขนาดสัมพัทธ์ของค่า — อันดับ 1 สำหรับค่าที่น้อยที่สุด และอันดับ n สำหรับค่าที่มากที่สุด (หรือกลับกัน) ต่างจากการเรียงลำดับ (ซึ่งจัดลำดับแถวใหม่) rank() จะเพิ่มคอลัมน์ใหม่ที่เก็บตำแหน่งตามลำดับควบคู่ไปกับข้อมูลเดิม การจัดอันดับใช้ในตารางอันดับ การคำนวณเปอร์เซ็นไทล์ และการทดสอบทางสถิติบางประเภทที่ต้องการตำแหน่งตามลำดับแทนค่าจริง

import pandas as pd

df = pd.DataFrame({
    'player': ['Alice', 'Bob', 'Carol', 'Dave', 'Eve'],
    'score': [88, 72, 95, 72, 85]
})

df['rank'] = df['score'].rank()
print(df)
#    player  score  rank
# 0   Alice     88   4.0
# 1     Bob     72   1.5   <- tied with Dave
# 2   Carol     95   5.0
# 3    Dave     72   1.5   <- tied with Bob
# 4     Eve     85   3.0

การจัดอันดับจากน้อยไปมากกับจากมากไปน้อย

โดยค่าเริ่มต้น rank() จะกำหนดอันดับ 1 ให้กับค่าน้อยที่สุด (เรียงจากน้อยไปมาก) หากต้องการให้อันดับ 1 เป็นค่าที่มากที่สุด (เช่น อันดับหนึ่งในการแข่งขัน) ให้ส่งค่า ascending=False รูปแบบนี้สอดคล้องกับธรรมเนียมที่ว่า “อันดับหนึ่ง = คะแนนสูงสุด” ซึ่งใช้ในการกีฬา ตารางอันดับ และการจัดอันดับยอดขาย

import pandas as pd

df = pd.DataFrame({'score': [70, 95, 85, 60, 90]})

# Rank 1 = highest score
df['competition_rank'] = df['score'].rank(ascending=False)
print(df)
#    score  competition_rank
# 0     70               4.0
# 1     95               1.0
# 2     85               3.0
# 3     60               5.0
# 4     90               2.0

วิธีจัดการค่าที่เท่ากัน

เมื่อหลายแถวมีค่าเท่ากัน (เสมอกัน) พารามิเตอร์ method จะกำหนดวิธีแจกแจงอันดับ ตัวเลือกมีดังนี้: 'average' (ค่าเริ่มต้น — แถวที่เสมอกันใช้อันดับเฉลี่ยร่วมกัน), 'min' (แถวที่เสมอกันทั้งหมดได้อันดับต่ำสุด), 'max' (ทั้งหมดได้อันดับสูงสุด), 'first' (แถวที่ปรากฏก่อนจะได้อันดับที่ต่ำกว่า) และ 'dense' (ไม่มีช่องว่างในหมายเลขอันดับหลังค่าที่เสมอกัน)

import pandas as pd

s = pd.Series([10, 20, 20, 30])

print('average:', s.rank(method='average').tolist())  # [1.0, 2.5, 2.5, 4.0]
print('min:    ', s.rank(method='min').tolist())      # [1.0, 2.0, 2.0, 4.0]
print('max:    ', s.rank(method='max').tolist())      # [1.0, 3.0, 3.0, 4.0]
print('first:  ', s.rank(method='first').tolist())    # [1.0, 2.0, 3.0, 4.0]
print('dense:  ', s.rank(method='dense').tolist())    # [1.0, 2.0, 2.0, 3.0]

อันดับแบบหนาแน่น: ไม่มีช่องว่างหลังค่าที่เสมอกัน

เมธอด 'dense' มีประโยชน์เป็นพิเศษเมื่อต้องการการจัดอันดับที่ไม่มีช่องว่าง ด้วย 'min' หากมีสองรายการเสมอกันในอันดับ 2 อันดับถัดไปจะเป็น 4 (ข้าม 3) แต่ด้วย 'dense' อันดับถัดไปจะเป็น 3 เสมอ ทำให้ลำดับต่อเนื่องกัน อันดับแบบหนาแน่นเป็นรูปแบบมาตรฐานของฟังก์ชันหน้าต่าง DENSE_RANK() ใน SQL และใช้กันทั่วไปในตารางอันดับ

import pandas as pd

df = pd.DataFrame({
    'name': ['A', 'B', 'C', 'D', 'E'],
    'score': [100, 80, 80, 60, 60]
})

df['dense_rank'] = df['score'].rank(method='dense', ascending=False).astype(int)
print(df)
#   name  score  dense_rank
# 0    A    100           1
# 1    B     80           2
# 2    C     80           2  <- same score, same rank
# 3    D     60           3  <- next rank is 3, not 4
# 4    E     60           3

อันดับเปอร์เซ็นไทล์ด้วย pct=True

การกำหนด pct=True ใน rank() จะปรับอันดับให้อยู่ในช่วง [0, 1] และให้ผลเป็น อันดับเปอร์เซ็นไทล์ ค่าที่มีอันดับเปอร์เซ็นไทล์ 0.8 หมายความว่าค่านั้นสูงกว่าค่า 80% ในคอลัมน์ การใช้งานนี้พบในด้านการเงิน (ผลการดำเนินงานตามเปอร์เซ็นไทล์) การให้คะแนน (เปอร์เซ็นไทล์ของคะแนน) และการตรวจหาค่าผิดปกติ

import pandas as pd

df = pd.DataFrame({'score': [50, 70, 80, 90, 100]})

df['percentile'] = df['score'].rank(pct=True)
print(df)
#    score  percentile
# 0     50         0.2
# 1     70         0.4
# 2     80         0.6
# 3     90         0.8
# 4    100         1.0

การจัดอันดับภายในกลุ่ม

หากต้องการคำนวณอันดับแยกกันภายในแต่ละกลุ่ม (เช่น อันดับเงินเดือนของแต่ละแผนก) ให้ใช้ groupby() ร่วมกับ rank() ใช้ groupby().rank() ซึ่งจะใช้ฟังก์ชันการจัดอันดับกับแต่ละกลุ่ม และส่งคืน Series ที่จัดแนวตามดัชนีเดิมของ DataFrame จึงเหมาะอย่างยิ่งสำหรับการเพิ่มคอลัมน์ “อันดับภายในกลุ่ม”

import pandas as pd

df = pd.DataFrame({
    'dept': ['Eng', 'Eng', 'HR', 'HR', 'Eng'],
    'name': ['Alice', 'Bob', 'Carol', 'Dave', 'Eve'],
    'salary': [90000, 70000, 55000, 65000, 80000]
})

df['dept_rank'] = df.groupby('dept')['salary'].rank(
    method='dense', ascending=False
).astype(int)
print(df.sort_values(['dept', 'dept_rank']))
#    dept   name  salary  dept_rank
# 0   Eng  Alice   90000          1
# 4   Eng    Eve   80000          2
# 1   Eng    Bob   70000          3
# 3    HR   Dave   65000          1
# 2    HR  Carol   55000          2

pd.cut() สำหรับช่วงที่มีความกว้างเท่ากัน

pd.cut(series, bins) จะแบ่งคอลัมน์ตัวเลขต่อเนื่องออกเป็นช่วงที่มีความกว้างเท่ากัน (ช่วงย่อย) และกำหนดแต่ละค่าให้อยู่ในช่วงของตน วิธีนี้จะแปลงตัวแปรต่อเนื่องให้เป็นตัวแปรเชิงหมวดหมู่ เหมาะสำหรับฮิสโตแกรม กลุ่มอายุ ช่วงรายได้ หรือภารกิจใด ๆ ที่ต้องการแบ่งค่าเป็นช่วง ผลลัพธ์คือ Categorical Series ที่มีป้ายกำกับเป็นช่วง

import pandas as pd

df = pd.DataFrame({'age': [5, 15, 25, 35, 45, 55, 65, 75]})

df['age_group'] = pd.cut(df['age'], bins=[0, 18, 35, 60, 100],
                          labels=['Child', 'Young Adult', 'Middle Age', 'Senior'])
print(df)
#    age    age_group
# 0    5        Child
# 1   15        Child
# 2   25  Young Adult
# 3   35  Young Adult
# 4   45   Middle Age
# 5   55   Middle Age
# 6   65       Senior
# 7   75       Senior

pd.qcut() สำหรับช่วงที่มีความถี่เท่ากัน

pd.qcut(series, q) จะแบ่งค่าออกเป็นช่วงตามควอนไทล์ โดยแต่ละช่วงมีจำนวนข้อมูลประมาณเท่ากัน ต่างจาก pd.cut() (ความกว้างเท่ากัน) ตรงที่ pd.qcut() สร้างกลุ่มที่มีขนาดเท่ากัน เหมาะสำหรับการแบ่งกลุ่มตามเปอร์เซ็นไทล์ เช่น คะแนนเดไซล์ การแบ่งควินไทล์ หรือการจัดกลุ่มควอร์ไทล์

import pandas as pd
import numpy as np

np.random.seed(0)
df = pd.DataFrame({'score': np.random.randint(40, 100, 20)})

# Split into 4 equal-frequency quartiles
df['quartile'] = pd.qcut(df['score'], q=4, labels=['Q1', 'Q2', 'Q3', 'Q4'])
print(df['quartile'].value_counts().sort_index())
# Q1    5
# Q2    5
# Q3    5
# Q4    5

cut() กับ qcut() — ความแตกต่างสำคัญ

ใช้ pd.cut() เมื่อช่วงของคุณมีความหมายตามธรรมชาติของขอบเขตข้อมูล (เช่น ช่วงอายุ 0–18, 18–35, 35–60) เพราะความกว้างของช่วงมีความหมายในเชิงเนื้อหา ใช้ pd.qcut() เมื่อต้องการให้แต่ละกลุ่มมีขนาดเท่ากัน โดยไม่ขึ้นกับตำแหน่งของขอบเขต เช่น การแบ่งลูกค้าเป็นควอร์ไทล์บนและล่าง การแจกแจงที่เบ้จะทำให้กลุ่มที่ได้จาก cut() มีขนาดไม่เท่ากันมาก แต่ qcut() จะสร้างกลุ่มที่มีขนาดเท่ากัน

import pandas as pd
import numpy as np

np.random.seed(0)
# Skewed distribution: most values near 0
skewed = pd.Series(np.random.exponential(scale=5, size=100).round())

# cut with equal width: many empty or tiny upper bins
cut_counts = pd.cut(skewed, bins=4).value_counts().sort_index()
print('cut():', cut_counts.values)

# qcut with equal frequency: always 25 per group
qcut_counts = pd.qcut(skewed, q=4).value_counts().sort_index()
print('qcut():', qcut_counts.values)

การเพิ่มหมายเลขอันดับเป็นคอลัมน์

รูปแบบที่เป็นระเบียบสำหรับสร้างตารางผลลัพธ์ที่จัดอันดับแล้วคือ เรียงจากมากไปน้อย รีเซ็ตดัชนีให้เริ่มจาก 0 เลื่อนค่าเพิ่ม 1 เพื่อให้หมายเลขอันดับอ่านง่ายสำหรับมนุษย์ และแสดงผลควบคู่กับข้อมูลเดิม วิธีนี้จะสร้างตารางอันดับที่พร้อมนำเสนอ โดยไม่มีช่องว่างและมีหมายเลขอันดับที่เรียบร้อย

import pandas as pd

df = pd.DataFrame({
    'team': ['Falcons', 'Eagles', 'Hawks', 'Owls'],
    'wins': [12, 9, 12, 7]
})

leaderboard = (
    df
    .sort_values('wins', ascending=False)
    .reset_index(drop=True)
)
leaderboard.index = leaderboard.index + 1
leaderboard.index.name = 'place'
print(leaderboard)

อันดับในฐานะคุณลักษณะสำหรับการเรียนรู้ของเครื่อง

คุณลักษณะที่แปลงเป็นอันดับมีประโยชน์ในการเรียนรู้ของเครื่อง เพราะทนต่อค่าผิดปกติ — ค่าที่ใหญ่มากหรือเล็กมากจะได้อันดับใกล้ปลายช่วง แทนที่จะทำให้การกระจายของคุณลักษณะเบ้ การแปลงเป็นอันดับบางครั้งใช้เป็นขั้นตอนเตรียมข้อมูลก่อนใช้แบบจำลองที่อาศัยต้นไม้ หรือใช้เมื่อสเกลของตัวเลขไม่มีความหมาย แต่ลำดับสัมพัทธ์มีความหมาย

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'income': [30000, 50000, 70000, 1_000_000]  # outlier at 1M
})

# Add rank as a feature
df['income_rank'] = df['income'].rank(pct=True)
print(df)
#      income  income_rank
# 0    30000         0.25
# 1    50000         0.50
# 2    70000         0.75
# 3  1000000         1.00
# The outlier has rank 1.0 — extreme but not disproportionate

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจของคุณเกี่ยวกับการจัดอันดับค่าใน Pandas

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า rank() กำหนดตำแหน่งตามลำดับให้กับค่า method='dense' ช่วยหลีกเลี่ยงช่องว่างหลังค่าที่เสมอกัน pct=True ให้ค่าอันดับเปอร์เซ็นไทล์ในช่วง [0,1] และ groupby().rank() คำนวณอันดับภายในกลุ่ม ใช้ pd.cut() สำหรับช่วงที่มีความกว้างเท่ากัน และใช้ pd.qcut() สำหรับช่วงที่มีความถี่เท่ากันเมื่อต้องการแบ่งตัวแปรต่อเนื่องเป็นช่วง บทถัดไปเราจะกำหนดและรีเซ็ตดัชนีของ DataFrame

คำถามที่พบบ่อย

บทเรียน “การจัดอันดับค่า” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การจัดอันดับค่า” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การจัดอันดับค่า”

กำหนดอันดับให้ค่าของคอลัมน์ด้วย rank() เลือกวิธีจัดการค่าที่มีอันดับเท่ากัน และสร้างช่วงเปอร์เซ็นไทล์ด้วย pd.cut() คุณปฏิบัติ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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