nlargest ใน pandas ผมใช้ดึง N แถวที่ค่าในคอลัมน์ที่ระบุสูงที่สุดออกมาเลย เช่น Top 3 ลูกค้ายอดซื้อเยอะสุด ถ้าใครเคยทำ Sort มาก→น้อย ใน Excel แล้วเอา N แถวบนสุด ตัวนี้คือคำสั่งเดียวที่ทำงานนั้นให้จบครับ
df.nlargest(n, columns)
df.nlargest(n, columns)
DataFrame
คืนเป็น DataFrame ก้อนใหม่ที่มีเฉพาะ N แถวค่าสูงสุด เรียงจากมากไปน้อยมาให้เรียบร้อย เอาไปทำงานต่อได้ทันที (index เดิมของแถวที่ถูกเลือกยังติดมาด้วยครับ)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| n | int | Yes | จำนวนแถวที่ต้องการดึงออกมา เช่น 3 คือเอา 3 แถวที่ค่าสูงสุด ถ้า n มากกว่าจำนวนแถวทั้งหมด ก็จะคืนทุกแถวที่มี | |
| columns | str | list | Yes | ชื่อคอลัมน์ที่ใช้เป็นเกณฑ์หาค่าสูงสุด เช่น ‘sales’ ถ้าใส่เป็น list หลายคอลัมน์ เช่น [‘score’,’age’] จะใช้คอลัมน์แรกตัดสินก่อน แล้วใช้คอลัมน์ถัดไปแก้กรณีค่าเสมอกัน |
df.nlargest(3, 'sales')df.nlargest(3, 'sales')
product sales
1 B 450
4 E 380
2 C 300
df.nlargest(1, 'score')df.nlargest(1, 'score')
name score
1 Bee 92
df.nlargest(2, ['score', 'age'])df.nlargest(2, ['score', 'age'])
name score age
1 Bee 90 30
3 Dao 90 28
ผลลัพธ์เหมือนกันครับ แต่เบื้องหลังต่างกัน nlargest ไม่ต้องเรียงทั้งตาราง มันหาเฉพาะ N ตัวใหญ่สุดเลยเร็วกว่าตอนข้อมูลเยอะแต่ N น้อย ส่วน sort_values ต้องเรียงทุกแถวก่อนแล้วค่อยตัดหัวมา ส่วนตัวผมเลยชอบ nlargest มากกว่าเพราะทั้งสั้นและสื่อความหมายตรงตัวว่า “เอาตัวใหญ่สุด N ตัว” ครับ
ใช้ nsmallest ครับ หน้าตาเหมือนกันเป๊ะ แค่เปลี่ยนชื่อ เช่น df.nsmallest(3, ‘sales’) ก็จะได้ 3 แถวที่ค่าน้อยสุดแทน เหมือน Sort น้อย→มาก แล้วเอา 3 แถวบนสุดนั่นแหละครับ
โดยปกติถ้าค่าเท่ากันแล้วเกินโควต้า N pandas จะเก็บแถวที่เจอก่อน (เหมือน keep=’first’) ครับ ถ้าอยากคุมให้ชัดว่าเสมอแล้วใช้อะไรตัดสิน ผมแนะนำใส่ columns เป็น list หลายคอลัมน์ไปเลย จะได้ผลที่คาดเดาได้แน่นอนกว่า
เวลาผมเจอโจทย์ทำนองว่า “ขอ Top 5 สินค้าขายดี” หรือ “ลูกค้า 10 คนที่จ่ายเยอะสุด” คำสั่งแรกที่ผมนึกถึงคือ nlargest ครับ
วิธีคิดง่ายๆ ในมุมคน Excel คือ มันเหมือนเรากด Sort คอลัมน์นั้นจากมากไปน้อย แล้วหยิบเอา N แถวบนสุดมา — แต่ nlargest ทำให้จบในบรรทัดเดียว ไม่ต้อง sort ทั้งตารางก่อนแล้วค่อยมา head เอง
ที่เจ๋งคือเบื้องหลังมันไม่ได้เรียงทั้งตารางจริงๆ ครับ มันใช้อัลกอริทึมที่เร็วกว่าการ sort เต็มๆ (โดยเฉพาะตอนข้อมูลเยอะแต่ N น้อย) เลยประหยัดแรงเครื่องไปได้เยอะ และผลลัพธ์ที่ได้ก็ยังเรียงจากมากไปน้อยมาให้เรียบร้อย พร้อมใช้ต่อทันที ✨
ส่วนตัวผมใช้ตัวนี้แทนการเขียน sort_values(ascending=False).head(n) เกือบทุกครั้งเลยครับ สั้นกว่า อ่านง่ายกว่า แล้วก็สื่อความหมายตรงตัวว่า “เอาตัวใหญ่สุด N ตัว” 😎