Thep Excel

pandas set_indexตั้งคอลัมน์เป็น index ของตาราง

set_index ใน pandas ผมใช้สำหรับตั้งคอลัมน์ใดคอลัมน์หนึ่ง (หรือหลายคอลัมน์) ให้กลายเป็น index หลักของ DataFrame เหมือนกับการกำหนดคีย์หลักให้ตาราง เพื่อให้ค้นหาข้อมูลด้วย .loc[] ได้อย่างรวดเร็วและตรงจุดครับ

>_
df.set_index(keys, drop, append)

ความนิยม5/10
ความยาก3/10
ประโยชน์5/10

อัปเดต 31 May 2026

Syntax & Arguments

คืนค่าDataFrame

คืนเป็น DataFrame ใหม่ที่มี index ที่เราตั้งแล้วครับ ต่อ .loc[] ได้ทันที หรือจะเก็บไว้ในตัวแปรใหม่เพื่อใช้งานต่อก็ได้

อาร์กิวเมนต์ ชนิด ค่าเริ่มต้น คำอธิบาย
keys str | list ชื่อคอลัมน์ที่ต้องการตั้งเป็น index เช่น ‘product_id’ หรือ [‘year’, ‘month’] สำหรับ MultiIndex
[drop]ไม่บังคับ bool True ถ้า True จะลบคอลัมน์ที่กลายเป็น index ออกจากส่วนข้อมูลปกติ (default) ถ้า False จะเก็บคอลัมน์นั้นไว้ด้วย
[append]ไม่บังคับ bool False ถ้า True จะเพิ่มคอลัมน์ที่เลือกต่อท้าย index เดิมแทนที่จะแทนที่ ใช้ตอนอยากเก็บ index เก่าไว้ด้วย

[ ] = อาร์กิวเมนต์ที่ไม่บังคับ

Additional Notes

ปกติเวลาสร้าง DataFrame ใหม่ pandas จะใส่เลข 0, 1, 2, 3 … เป็น index ให้อัตโนมัติ ซึ่งก็ใช้ได้ แต่ถ้าข้อมูลเรามีคอลัมน์ที่ระบุตัวตนของแต่ละแถวอยู่แล้ว เช่น รหัสสินค้า ชื่อพนักงาน หรือวันที่ ผมจะตั้งคอลัมน์นั้นเป็น index แทนเลขลำดับครับ

วิธีคิดง่ายๆ คือนึกถึง Excel ที่เราตรึงคอลัมน์ A ไว้เป็นคีย์อ้างอิง แล้วใช้ VLOOKUP หาค่าจากคีย์นั้น — set_index ทำแบบเดียวกันครับ แต่หลังจาก set_index แล้ว เราใช้ .loc[] แทน VLOOKUP ได้เลย ไม่ต้องระบุหมายเลขแถว

ที่เจ๋งคือเราตั้ง index หลายคอลัมน์พร้อมกันได้เลย (MultiIndex) คล้ายกับการจัดกลุ่มข้อมูลใน PivotTable ที่มี Row Label ซ้อนกันหลายระดับ ทำให้กรองข้อมูลแบบลำดับชั้นได้สวยมากครับ ✨

ส่วนตัวผมชอบใช้ set_index ก่อนจะทำ .loc[] lookup ครับ เพราะพอมี index ที่มีความหมายแล้ว โค้ดอ่านง่ายขึ้นชัดเจนเลย แทนที่จะเขียน df[df[‘product_id’] == ‘A001’] ก็เขียนแค่ df.loc[‘A001’] แทนได้เลย 😎

Examples

ตัวอย่างที่ 1: ตั้งคอลัมน์รหัสสินค้าเป็น index แล้วค้นหาด้วย .loc[]df.set_index('product_id').loc['A002']

ผมตั้ง product_id เป็น index ก่อน แล้วใช้ .loc['A002'] ดึงแถวของสินค้า A002 ออกมาได้เลยครับ สะอาดกว่าเขียน df[df['product_id'] == 'A002'] แบบเดิมมากเลย เหมือน VLOOKUP ใน Excel แต่อ่านง่ายกว่าเยอะ

>_
df.set_index('product_id').loc['A002']

ผลลัพธ์name ดินสอ
price 10
Name: A002, dtype: object
ตัวอย่างที่ 2: ตั้ง MultiIndex จากสองคอลัมน์ แล้ว .loc[] ตามลำดับชั้นdf_mi.loc[2023]

ผมตั้ง index สองชั้นจากคอลัมน์ year และ month พอจะดูข้อมูลปี 2023 ทั้งหมด ใช้ df_mi.loc[2023] ได้เลยครับ มันจะคืนทุกแถวที่ year เป็น 2023 มาให้ เหมือนการ drill-down ใน PivotTable ของ Excel ที่กด expand เพื่อดูรายปีเลย

>_
df_mi.loc[2023]

ผลลัพธ์ sales
month
Jan 100
Feb 150
ตัวอย่างที่ 3: ใช้ drop=False เพื่อเก็บคอลัมน์ index ไว้ในข้อมูลด้วยdf.set_index('product_id', drop=False)

ปกติ set_index จะลบคอลัมน์ที่กลายเป็น index ออกจากส่วนข้อมูลครับ แต่ถ้าผมใส่ drop=False คอลัมน์ product_id ก็จะยังคงอยู่ในตารางด้วย ใช้ตอนที่ผมต้องการให้ product_id เป็นทั้ง index และยังเป็น column อยู่ในข้อมูลด้วยครับ เช่น ตอนจะ export หรือ merge ต่อ

>_
df.set_index('product_id', drop=False)

ผลลัพธ์ product_id name price
product_id
A001 A001 ปากกา 25
A002 A002 ดินสอ 10
A003 A003 ยางลบ 5
ตัวอย่างที่ 4: .loc[] เจาะจง row+column หลัง set_indexdf_idx.loc['A001', 'price']

อันนี้คือพลังเต็มๆ ของ set_index ครับ พอตั้ง product_id เป็น index แล้ว ผมใช้ .loc['A001', 'price'] ดึงราคาของสินค้า A001 ออกมาได้เป็น scalar เลย แบบเดียวกับที่ใน Excel เราใช้ INDEX-MATCH เพื่อหาค่าเฉพาะจุด แต่เขียนสั้นกว่ามากครับ

>_
df_idx.loc['A001', 'price']

ผลลัพธ์25

FAQs

set_index แล้วข้อมูลเดิมเปลี่ยนไปด้วยไหม?+

ไม่ครับ pandas ไม่แก้ DataFrame เดิมของเรา แต่คืน DataFrame ใหม่ที่มี index ใหม่มาให้ ผมเลยต้องเขียน df_new = df.set_index('product_id') หรือถ้าอยากให้แก้ตัวเองเลยก็เพิ่ม inplace=True เข้าไปครับ แต่ผมไม่ค่อยแนะนำ inplace เพราะ debug ยากกว่า

ถ้า index มีค่าซ้ำกัน .loc[] จะได้ผลลัพธ์ยังไง?+

ถ้า index มีค่าซ้ำ .loc[] จะคืนแถวทั้งหมดที่ตรงกันออกมาเป็น DataFrame ครับ ไม่ใช่แถวเดียว เช่น ถ้าสินค้า A001 มีอยู่ 3 แถว df.loc['A001'] จะได้ DataFrame 3 แถว ผมเจอบ้างนะครับ ตอนแรกงงว่าทำไมได้หลายแถว สรุปคือ set_index ไม่บังคับว่า index ต้องไม่ซ้ำครับ ต่างจาก primary key ใน database

ต่างจาก df[df['col'] == value] ยังไง?+

ได้ผลเหมือนกันครับ แต่วิธีคิดและประสิทธิภาพต่างกัน df[df['col'] == value] คือการสแกนทุกแถวเพื่อเปรียบเทียบ ส่วน .loc[] หลัง set_index ใช้ index lookup ซึ่งเร็วกว่ามากเวลาข้อมูลเยอะครับ แถมโค้ดอ่านง่ายกว่าด้วย ผมเลยชอบ set_index + loc กว่าในกรณีที่ต้องค้นหาบ่อยๆ

Resources & Related

ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas set_index จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้pandas set_indexTransform
Transform (2)
pandas reset_index

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

pandas sort_values

df.sort_values() ใน pandas ผมใช้สำหรับเรียงลำดับแถวใน DataFrame ตามค่าของคอลัมน์ที่กำหนด เรียงจากน้อยไปมากหรือมากไปน้อยก็ได้ และยังเรียงตามหลายคอลัมน์พร้อมกันได้ด้วยครับ

Selection (1)
pandas loc

df.loc ใน pandas ผมใช้สำหรับเลือกข้อมูลจาก DataFrame โดยระบุ label ของแถวและคอลัมน์ ไม่ว่าจะเลือกแถวเดียว หลายแถว หรือกรองด้วยเงื่อนไข Boolean เหมือนการกด Ctrl+F ใน Excel แต่ทรงพลังกว่ามากครับ

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่