---
title: pandas reset_index — เปลี่ยน index กลับมาเป็นคอลัมน์ปกติ
url: https://www.thepexcel.com/functions/python/transform/pandas-reset-index/
type: function-explainer
program: Python
syntax: "df.reset_index(drop, inplace)"
date: 2026-05-31
scores:
  popularity: 5
  difficulty: 3
  usefulness: 5
---

# pandas reset_index — เปลี่ยน index กลับมาเป็นคอลัมน์ปกติ

> reset_index ผมใช้สำหรับเปลี่ยน index ของ DataFrame กลับมาเป็นคอลัมน์ธรรมดา แล้วเซ็ต index ใหม่เป็น 0

## คำอธิบาย

reset_index ผมใช้สำหรับเปลี่ยน index ของ DataFrame กลับมาเป็นคอลัมน์ธรรมดา แล้วเซ็ต index ใหม่เป็น 0, 1, 2, ... ตามลำดับ — ส่วนใหญ่จะโผล่หลัง groupby ทุกครั้งที่อยากนำผลลัพธ์ไปใช้งานต่อครับ

## Syntax

```excel
df.reset_index(drop, inplace)
```

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| drop | No | bool | False | ถ้า True จะทิ้ง index เก่าทิ้งเลย ไม่นำมาเป็นคอลัมน์ใหม่ ใช้ตอนที่ index เดิมไม่มีความหมาย เช่น หลังจาก sort หรือ filter แล้วอยากได้แค่เลขลำดับแถวใหม่สะอาดๆ |
| inplace | No | bool | False | ถ้า True จะแก้ DataFrame ตัวเดิมเลย ไม่คืนค่าออกมา ผมแนะนำให้ใช้แบบ default (False) แล้วรับค่าใน variable ใหม่จะปลอดภัยกว่าครับ |

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: reset_index หลัง groupby — กรณีที่เจอบ่อยที่สุด

```excel
grouped.reset_index()
```

**ผลลัพธ์:** `         city  sales
0     Bangkok    250
1  Chiang Mai    450`

ผมจัดกลุ่มยอดขายตามเมืองไว้ใน grouped ก่อนครับ ตอนนั้น city ไปอยู่เป็น index ไม่ใช่คอลัมน์ พอเรียก reset_index() ก็จะได้ DataFrame กลับมาที่มีทั้ง city และ sales เป็นคอลัมน์ปกติ พร้อมเลขลำดับแถว 0, 1 เหมือนตารางทั่วไปเลยครับ ขั้นตอนนี้เหมือนกด Copy Paste Value ออกจาก PivotTable ใน Excel

### 2. ตัวอย่างที่ 2: drop=True — ทิ้ง index เก่า ไม่เอามาเป็นคอลัมน์

```excel
filtered.reset_index(drop=True)
```

**ผลลัพธ์:** `  product  score
0       B     95
1       D     88
2       E     91`

หลังจาก filter เอาแค่ product ที่ score >= 85 ผมได้ DataFrame ที่มีแถวเลขกระโดด (index 1, 3, 4) ครับ พอใช้ reset_index(drop=True) index ใหม่จะเป็น 0, 1, 2 สะอาดเลย โดยไม่มีคอลัมน์ index เก่ามาแทรก ถ้าไม่ใส่ drop=True มันจะเพิ่มคอลัมน์ชื่อ 'index' มาให้ด้วยซึ่งส่วนใหญ่ผมไม่ได้ต้องการครับ

### 3. ตัวอย่างที่ 3: groupby หลายคอลัมน์แล้ว reset_index

```excel
summary.reset_index()
```

**ผลลัพธ์:** `  region product  sales
0  North       A    220
1  North       B    200
2  South       A    150
3  South       B    300`

ตอน groupby หลายคอลัมน์ pandas จะสร้าง MultiIndex (index หลายชั้น) ซึ่งทำงานต่อยากมากครับ reset_index() จัดการให้ทุกคอลัมน์กลับมาอยู่ในระนาบเดียวกันหมด — region, product, sales ออกมาเป็นคอลัมน์ธรรมดา 3 คอลัมน์ เอาไป merge หรือ export ได้เลยโดยไม่ต้องแก้อะไรเพิ่มอีก

### 4. ตัวอย่างที่ 4: reset_index หลัง sort_values เพื่อเรียงลำดับใหม่

```excel
sorted_df.reset_index(drop=True)
```

**ผลลัพธ์:** `      name  score
0      Bob     95
1    Diana     90
2    Alice     88
3  Charlie     72`

หลัง sort_values แถวจะเรียงตาม score แต่ index ยังเป็น 1, 3, 2, 0 ตามลำดับเดิมครับ ถ้าเราอยากให้แถวอันดับ 1 มี index=0 ต้องใช้ reset_index(drop=True) เพื่อ reset เป็นลำดับใหม่ ผมใช้บ่อยตอนสร้าง 'Top N' report แล้วอยากให้เลข ranking เริ่มจาก 0 หรือ 1 ที่ถูกต้องครับ

## หมายเหตุเพิ่มเติม

- 💡 ผมมักเขียน .groupby(...).sum().reset_index() ต่อกันในบรรทัดเดียวเลยครับ — chain แบบนี้อ่านง่าย จัดกลุ่ม-รวม-แปลงกลับ ครบในบรรทัดเดียว ไม่ต้องสร้าง intermediate variable

- ถ้าเจอ DataFrame ที่มี MultiIndex (เช่นหลัง groupby หลายคอลัมน์) แล้วงงว่าทำไม df['city'] ไม่เจอ ให้ลอง df.reset_index() ก่อนเลยครับ ปัญหาส่วนใหญ่หายทันที

## คำถามที่พบบ่อย

**Q: ทำไม AI ถึงเขียน .reset_index() หลัง groupby แทบทุกครั้ง จำเป็นไหม?**

จำเป็นในงานจริงครับ เพราะหลัง groupby คอลัมน์ที่ใช้จัดกลุ่มจะกลายเป็น index ไม่ใช่คอลัมน์ ถ้าอยากทำต่อเช่น merge กับตารางอื่น หรือ export เป็น Excel แล้วเห็นคอลัมน์ครบ ต้อง reset ก่อน ผมลืมครั้งแรก แล้วได้ KeyError ตอน merge ซึ่งงงมากเพราะเห็นว่าชื่อคอลัมน์มีอยู่ แต่ดันอยู่ใน index ไม่ใช่คอลัมน์ครับ

**Q: ต่างกันยังไงระหว่างใส่ drop=True กับไม่ใส่?**

ถ้าไม่ใส่ drop (default=False) index เก่าจะถูกเพิ่มเป็นคอลัมน์ใหม่ให้ครับ — เหมาะตอนที่ index มีความหมาย เช่น หลัง groupby ที่ index คือชื่อเมือง ถ้าใส่ drop=True index เก่าจะถูกทิ้งทันที — เหมาะตอน index เป็นแค่เลขลำดับที่ไม่มีความหมาย เช่น หลัง sort หรือ filter ผมใช้ drop=True ประมาณ 60% ของเวลาครับ

**Q: ต่างจาก set_index ยังไง?**

เป็นตรงข้ามกันเลยครับ set_index เอาคอลัมน์ไปเป็น index ส่วน reset_index เอา index กลับมาเป็นคอลัมน์ ถ้านึกภาพ Excel คือ set_index = กำหนดคอลัมน์แรกเป็น row header, reset_index = เอา row header กลับมาเป็นคอลัมน์ปกติ

## แหล่งข้อมูลเพิ่มเติม

- [pandas.DataFrame.reset_index (official docs)](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.reset_index.html) _(article)_

---

_Source: [https://www.thepexcel.com/functions/python/transform/pandas-reset-index/](https://www.thepexcel.com/functions/python/transform/pandas-reset-index/)_
