df.sort_values() ใน pandas ผมใช้สำหรับเรียงลำดับแถวใน DataFrame ตามค่าของคอลัมน์ที่กำหนด เรียงจากน้อยไปมากหรือมากไปน้อยก็ได้ และยังเรียงตามหลายคอลัมน์พร้อมกันได้ด้วยครับ
df.sort_values(by)
df.sort_values(by)
DataFrame
คืนเป็น DataFrame ใหม่ที่เรียงแล้วครับ DataFrame ต้นฉบับไม่เปลี่ยน index เดิมยังอยู่ ถ้าอยากให้ index เริ่มใหม่จาก 0 ให้ใส่ ignore_index=True หรือต่อด้วย .reset_index(drop=True)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| by | str | list | Yes | ชื่อคอลัมน์ที่ใช้เรียง เช่น ‘score’ หรือ [‘dept’, ‘score’] สำหรับเรียงตามหลายคอลัมน์ | |
| ascending | bool | list | Optional | True | True=เรียงจากน้อยไปมาก, False=มากไปน้อย ถ้า by เป็น list ใส่ list ได้เช่น [True, False] เพื่อกำหนดแต่ละคอลัมน์ต่างกัน |
| inplace | bool | Optional | False | ถ้า True จะแก้ไข DataFrame ต้นฉบับเลย ไม่คืน DataFrame ใหม่ ผมแนะนำให้ใช้ False แล้วเก็บในตัวแปรใหม่ครับ |
| na_position | str | Optional | 'last' | ตำแหน่งของ NaN ในผลลัพธ์ ‘last’=NaN ไปอยู่ท้าย (default), ‘first’=NaN อยู่หัว |
| ignore_index | bool | Optional | False | ถ้า True จะ reset index ของผลลัพธ์ให้เริ่มจาก 0 ใหม่ ไม่ต้องต่อด้วย .reset_index() แยก |
df.sort_values('score')df.sort_values('score')
name score
1 Bob 60
3 Dan 75
0 Ana 85
2 Cara 92
df.sort_values('score', ascending=False)df.sort_values('score', ascending=False)
name score
2 Cara 92
0 Ana 85
3 Dan 75
1 Bob 60
df.sort_values(['dept', 'score'], ascending=[True, False])df.sort_values(['dept', 'score'], ascending=[True, False])
dept score
3 HR 75
1 HR 60
2 IT 92
0 IT 85
มีสองวิธีครับ วิธีแรกต่อด้วย .reset_index(drop=True) เช่น df.sort_values(‘score’).reset_index(drop=True) ใส่ drop=True เพื่อไม่ให้ index เดิมกลายเป็นคอลัมน์ใหม่ วิธีที่สองใส่ ignore_index=True ตอน sort_values เลย สั้นกว่าครับ
ค่า default คือ NaN ไปอยู่ท้ายเสมอครับ ไม่ว่าจะเรียงขึ้นหรือลง ถ้าอยากให้ NaN อยู่หัวให้ใส่ na_position=’first’ เพิ่มเข้าไป ผมมักปล่อย default ไว้เพราะอยากเห็นข้อมูลจริงก่อนครับ
df.sort_values() เป็นฟังก์ชันที่ผมใช้ตลอดเวลาตอนเตรียมข้อมูลเพื่อแสดงผลหรือวิเคราะห์ครับ 😎
รับชื่อคอลัมน์ (by) แล้วเรียงแถวทั้ง DataFrame ตามค่าในคอลัมน์นั้น ค่า default เรียงจากน้อยไปมาก (ascending=True) ใส่ ascending=False เพื่อกลับทิศได้ทันที และถ้าส่ง list ของคอลัมน์เข้าไปจะเรียงหลักแรกก่อน แล้ว tiebreak ด้วยคอลัมน์ถัดไป
ที่เจ๋งคือสามารถกำหนดทิศทางการเรียงของแต่ละคอลัมน์ต่างกันได้ด้วย list เช่น ascending=[True, False] เรียงคอลัมน์แรก A→Z และคอลัมน์สอง Z→A พร้อมกัน ✨
ส่วนตัวผมใช้ sort_values บ่อยมากตอนหา top N เช่น ต้องการ 5 สินค้าขายดีสุด ก็ sort แล้วต่อด้วย .head(5) จบครับ อีกกรณีคือก่อน reset_index เพื่อให้แถวเรียงสวยก่อน export