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 เก่าไว้ด้วย |
[ ] = อาร์กิวเมนต์ที่ไม่บังคับ
ปกติเวลาสร้าง 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’] แทนได้เลย 😎
ผมตั้ง product_id เป็น index ก่อน แล้วใช้ .loc['A002'] ดึงแถวของสินค้า A002 ออกมาได้เลยครับ สะอาดกว่าเขียน df[df['product_id'] == 'A002'] แบบเดิมมากเลย เหมือน VLOOKUP ใน Excel แต่อ่านง่ายกว่าเยอะ
ผมตั้ง index สองชั้นจากคอลัมน์ year และ month พอจะดูข้อมูลปี 2023 ทั้งหมด ใช้ df_mi.loc[2023] ได้เลยครับ มันจะคืนทุกแถวที่ year เป็น 2023 มาให้ เหมือนการ drill-down ใน PivotTable ของ Excel ที่กด expand เพื่อดูรายปีเลย
ปกติ set_index จะลบคอลัมน์ที่กลายเป็น index ออกจากส่วนข้อมูลครับ แต่ถ้าผมใส่ drop=False คอลัมน์ product_id ก็จะยังคงอยู่ในตารางด้วย ใช้ตอนที่ผมต้องการให้ product_id เป็นทั้ง index และยังเป็น column อยู่ในข้อมูลด้วยครับ เช่น ตอนจะ export หรือ merge ต่อ
อันนี้คือพลังเต็มๆ ของ set_index ครับ พอตั้ง product_id เป็น index แล้ว ผมใช้ .loc['A001', 'price'] ดึงราคาของสินค้า A001 ออกมาได้เป็น scalar เลย แบบเดียวกับที่ใน Excel เราใช้ INDEX-MATCH เพื่อหาค่าเฉพาะจุด แต่เขียนสั้นกว่ามากครับ
ไม่ครับ pandas ไม่แก้ DataFrame เดิมของเรา แต่คืน DataFrame ใหม่ที่มี index ใหม่มาให้ ผมเลยต้องเขียน df_new = df.set_index('product_id') หรือถ้าอยากให้แก้ตัวเองเลยก็เพิ่ม inplace=True เข้าไปครับ แต่ผมไม่ค่อยแนะนำ inplace เพราะ debug ยากกว่า
ถ้า index มีค่าซ้ำ .loc[] จะคืนแถวทั้งหมดที่ตรงกันออกมาเป็น DataFrame ครับ ไม่ใช่แถวเดียว เช่น ถ้าสินค้า A001 มีอยู่ 3 แถว df.loc['A001'] จะได้ DataFrame 3 แถว ผมเจอบ้างนะครับ ตอนแรกงงว่าทำไมได้หลายแถว สรุปคือ set_index ไม่บังคับว่า index ต้องไม่ซ้ำครับ ต่างจาก primary key ใน database
ได้ผลเหมือนกันครับ แต่วิธีคิดและประสิทธิภาพต่างกัน df[df['col'] == value] คือการสแกนทุกแถวเพื่อเปรียบเทียบ ส่วน .loc[] หลัง set_index ใช้ index lookup ซึ่งเร็วกว่ามากเวลาข้อมูลเยอะครับ แถมโค้ดอ่านง่ายกว่าด้วย ผมเลยชอบ set_index + loc กว่าในกรณีที่ต้องค้นหาบ่อยๆ
ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas set_index จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
reset_index ผมใช้สำหรับเปลี่ยน index ของ DataFrame กลับมาเป็นคอลัมน์ธรรมดา แล้วเซ็ต index ใหม่เป็น 0, 1, 2, … ตามลำดับ — ส่วนใหญ่จะโผล่หลัง groupby ทุกครั้งที่อยากนำผลลัพธ์ไปใช้งานต่อครับ
df.sort_values() ใน pandas ผมใช้สำหรับเรียงลำดับแถวใน DataFrame ตามค่าของคอลัมน์ที่กำหนด เรียงจากน้อยไปมากหรือมากไปน้อยก็ได้ และยังเรียงตามหลายคอลัมน์พร้อมกันได้ด้วยครับ
df.loc ใน pandas ผมใช้สำหรับเลือกข้อมูลจาก DataFrame โดยระบุ label ของแถวและคอลัมน์ ไม่ว่าจะเลือกแถวเดียว หลายแถว หรือกรองด้วยเงื่อนไข Boolean เหมือนการกด Ctrl+F ใน Excel แต่ทรงพลังกว่ามากครับ
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่