reset_index ผมใช้สำหรับเปลี่ยน index ของ DataFrame กลับมาเป็นคอลัมน์ธรรมดา แล้วเซ็ต index ใหม่เป็น 0, 1, 2, … ตามลำดับ — ส่วนใหญ่จะโผล่หลัง groupby ทุกครั้งที่อยากนำผลลัพธ์ไปใช้งานต่อครับ
df.reset_index(drop, inplace)
df.reset_index(drop, inplace)
DataFrame
คืน DataFrame ใหม่ที่ index ถูก reset เป็น 0, 1, 2, … และ index เก่ากลายเป็นคอลัมน์ปกติ (ถ้าไม่ได้ใส่ drop=True) พร้อมเอาไปใช้งานต่อหรือ chain ได้เลยครับ
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| drop | bool | Optional | False | ถ้า True จะทิ้ง index เก่าทิ้งเลย ไม่นำมาเป็นคอลัมน์ใหม่ ใช้ตอนที่ index เดิมไม่มีความหมาย เช่น หลังจาก sort หรือ filter แล้วอยากได้แค่เลขลำดับแถวใหม่สะอาดๆ |
| inplace | bool | Optional | False | ถ้า True จะแก้ DataFrame ตัวเดิมเลย ไม่คืนค่าออกมา ผมแนะนำให้ใช้แบบ default (False) แล้วรับค่าใน variable ใหม่จะปลอดภัยกว่าครับ |
grouped.reset_index()grouped.reset_index()
city sales
0 Bangkok 250
1 Chiang Mai 450
filtered.reset_index(drop=True)filtered.reset_index(drop=True)
product score
0 B 95
1 D 88
2 E 91
summary.reset_index()summary.reset_index()
region product sales
0 North A 220
1 North B 200
2 South A 150
3 South B 300
sorted_df.reset_index(drop=True)sorted_df.reset_index(drop=True)
name score
0 Bob 95
1 Diana 90
2 Alice 88
3 Charlie 72
จำเป็นในงานจริงครับ เพราะหลัง groupby คอลัมน์ที่ใช้จัดกลุ่มจะกลายเป็น index ไม่ใช่คอลัมน์ ถ้าอยากทำต่อเช่น merge กับตารางอื่น หรือ export เป็น Excel แล้วเห็นคอลัมน์ครบ ต้อง reset ก่อน ผมลืมครั้งแรก แล้วได้ KeyError ตอน merge ซึ่งงงมากเพราะเห็นว่าชื่อคอลัมน์มีอยู่ แต่ดันอยู่ใน index ไม่ใช่คอลัมน์ครับ
ถ้าไม่ใส่ drop (default=False) index เก่าจะถูกเพิ่มเป็นคอลัมน์ใหม่ให้ครับ — เหมาะตอนที่ index มีความหมาย เช่น หลัง groupby ที่ index คือชื่อเมือง ถ้าใส่ drop=True index เก่าจะถูกทิ้งทันที — เหมาะตอน index เป็นแค่เลขลำดับที่ไม่มีความหมาย เช่น หลัง sort หรือ filter ผมใช้ drop=True ประมาณ 60% ของเวลาครับ
เป็นตรงข้ามกันเลยครับ set_index เอาคอลัมน์ไปเป็น index ส่วน reset_index เอา index กลับมาเป็นคอลัมน์ ถ้านึกภาพ Excel คือ set_index = กำหนดคอลัมน์แรกเป็น row header, reset_index = เอา row header กลับมาเป็นคอลัมน์ปกติ
ใน pandas ทุกครั้งที่เราทำ groupby ผลที่ได้จะมีคอลัมน์ที่ใช้จัดกลุ่ม (เช่น ‘city’ หรือ ‘dept’) ไปอยู่เป็น index แถวแทนที่จะเป็นคอลัมน์ปกติครับ ซึ่งดูเหมือนไม่ใช่เรื่องใหญ่ แต่พอเราอยากเอาผลไปทำงานต่อ เช่น merge กับตารางอื่น หรือ export เป็น Excel นั่นแหละปัญหาเริ่มโผล่ reset_index จึงเป็นตัวแก้ปัญหานี้ตรงๆ — มันดึงค่า index กลับมาเป็นคอลัมน์ธรรมดา แล้วเซ็ตเลขลำดับแถว 0, 1, 2 ให้ใหม่
ที่เจ๋งคือ reset_index เป็นเหมือน “ปิดจบ” ของ chain หลัง groupby ครับ ถ้าเห็น AI เขียนโค้ด pandas แล้วมี .reset_index() ท้ายสุด ไม่ต้องงง — มันแค่แปลง index กลับมาเพื่อให้ DataFrame พร้อมใช้งานต่อ เหมือนกด Refresh PivotTable แล้วได้ตารางที่คัดลอกออกมาได้เลยครับ 😎
ส่วนตัวผม reset_index ติดมือมากครับ แทบทุก groupby ผมจะตามด้วย .reset_index() เสมอ เพราะงานจริงต้องเอาผลลัพธ์ไป merge หรือ export แทบทุกครั้ง — ถ้าไม่ reset แล้วไป merge จะ error งงหาสาเหตุไม่เจอ