การจัดอันดับค่า
กำหนดอันดับให้ค่าของคอลัมน์ด้วย 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 2pd.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 Seniorpd.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 5cut() กับ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ