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