DataFrame
ได้คืนเป็น DataFrame เมื่อ row selector เลือกหลายแถว และ column selector เลือกหลายคอลัมน์ครับ แต่ถ้า row selector เป็น label เดี่ยวจะได้ Series, ถ้าทั้ง row และ col เป็น scalar เดี่ยวจะได้ scalar โดยตรงเลย
| อาร์กิวเมนต์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
| row_label | label | slice | boolean array | callable | ระบุแถวที่ต้องการ — ใช้ชื่อ index เดี่ยว, slice ของชื่อ, array of boolean, หรือ callable ที่รับ DataFrame แล้ว return selector ก็ได้ | |
| [col_label]ไม่บังคับ | label | list | slice | ทุกคอลัมน์ | ระบุคอลัมน์ที่ต้องการ — ถ้าไม่ใส่จะได้ทุกคอลัมน์ ใส่ชื่อเดี่ยวได้ Series ใส่ list ได้ DataFrame |
[ ] = อาร์กิวเมนต์ที่ไม่บังคับ
df.loc เป็นวิธีหลักที่ pandas ใช้เลือกข้อมูลแบบ label-based ครับ ต่างจาก df.iloc ที่ดูตำแหน่งตัวเลข — loc ดูที่ชื่อ index และชื่อคอลัมน์จริงๆ เลย ไม่ต้องนับว่าแถวที่กี่ตำแหน่ง
รูปแบบพื้นฐานคือ df.loc[row_selector, column_selector] — ตัวแรกบอกแถว ตัวที่สองบอกคอลัมน์ ถ้าใส่แค่ตัวเดียวผมจะได้ทุกคอลัมน์ของแถวนั้น ถ้าอยากเลือกเฉพาะคอลัมน์ก็ใส่ตัวที่สองเพิ่มได้เลย
ที่เจ๋งที่สุดของ loc สำหรับผมคือ Boolean mask — เอาเงื่อนไขเช่น df[‘age’] > 25 ใส่เข้าไป pandas จะคืนเฉพาะแถวที่ผ่านเงื่อนไขกลับมา เหมือน AutoFilter ใน Excel แต่เขียนใน code ได้เลย ✨
ส่วนตัวผมใช้ loc บ่อยกว่า iloc เพราะชื่อ column บอกความหมายชัดเจนกว่าตัวเลขครับ ถ้าข้อมูลมีการเพิ่ม/ลบคอลัมน์ทีหลัง code ที่ใช้ loc ก็ยังทำงานถูกต้องอยู่ ต่างจาก iloc ที่อาจเพี้ยนได้ถ้าลำดับเปลี่ยน 😎
ผมสร้าง Boolean mask จากเงื่อนไข df['age'] > 25 แล้วใส่เข้า loc — pandas จะคืนเฉพาะแถวที่ age มากกว่า 25 กลับมาเป็น DataFrame ครับ เหมือน AutoFilter ใน Excel แต่เขียนใน code ได้เลย Bob, Charlie, David ผ่านเงื่อนไข Alice ไม่ผ่านเพราะอายุ 24
คราวนี้ผมเพิ่ม argument ที่สองให้ loc เพื่อเลือกเฉพาะคอลัมน์ name กับ salary ครับ แถวที่ salary ≥ 55000 มีแค่ Charlie, David และ Bob — ผลลัพธ์ออกมาเป็น DataFrame สองคอลัมน์ ไม่มี age ให้รก
ตัวอย่างนี้ผมใช้ index ที่เป็นชื่อคนครับ df.loc['Bob'] คืนทุก column ของแถว Bob กลับมาเป็น Series — ค่า index คือชื่อคอลัมน์ ค่า value คือข้อมูลในแถวนั้น ถ้าเปรียบกับ Excel ก็เหมือน VLOOKUP แบบหาชื่อแล้วดึงข้อมูลในแถวนั้นออกมาเลย
ผมรวมสองเงื่อนไขด้วย & (AND) ครับ ต้องใส่ () ครอบแต่ละเงื่อนไขด้วย มิฉะนั้น Python จะ error เพราะ operator precedence ผลลัพธ์คือแถวที่เป็น IT และมีประสบการณ์ 5 ปีขึ้นไป ถ้าอยากได้ OR ใช้ | แทนครับ
ต่างกันที่ loc ใช้ label (ชื่อ index / ชื่อคอลัมน์) ส่วน iloc ใช้ตำแหน่งตัวเลข 0-based ครับ เช่น df.loc['Alice'] กับ df.iloc[0] อาจได้แถวเดียวกัน แต่ถ้าเราเรียงลำดับ DataFrame ใหม่ iloc[0] จะได้แถวอื่น ส่วน loc['Alice'] ยังได้ Alice อยู่เสมอ ผมเลยชอบ loc มากกว่าเพราะ predictable กว่าครับ
เพราะ Python มี operator precedence ครับ & และ | มี priority ต่ำกว่า == และ > ถ้าไม่ใส่ () Python จะตีความผิดและ throw error หรือได้ผลผิดพลาด ผมจำง่ายๆ ว่า 'แต่ละเงื่อนไขต้องมีวงเล็บครอบ' เช่น (df['a'] > 1) & (df['b'] == 'X') ครับ
ได้เลยครับ! df.loc[df['status'] == 'inactive', 'score'] = 0 จะ set ค่า score เป็น 0 ทุกแถวที่ status เป็น inactive ผมใช้แบบนี้บ่อยมากตอนต้องการแก้ไขข้อมูลบางส่วนโดยไม่กระทบแถวอื่น คล้ายกับใช้ IF + range ใน Excel แต่สะดวกกว่ามากครับ
ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas loc จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
iloc ใน pandas ผมใช้สำหรับเลือกแถวและคอลัมน์ด้วยตำแหน่งตัวเลข (0-based index) เหมือนการอ้างอิงเซลล์ใน Excel ด้วยเลขแถว-คอลัมน์ครับ ต่างจาก loc ตรงที่ iloc ไม่สนใจชื่อ index — ดูแค่ว่าอยู่ตำแหน่งที่เท่าไหร่เท่านั้น
isin ใน pandas ผมใช้เช็คว่าแต่ละค่าในคอลัมน์ตรงกับค่าใน list ที่กำหนดไหม คืนมาเป็น True/False ทีละแถว ถ้าใครเคย filter หลายค่าพร้อมกันใน Excel หรือเขียน OR หลายเงื่อนไขซ้อนๆ กัน ตัวนี้คือทางลัดที่สะอาดกว่ามากครับ
query ใน pandas ผมใช้กรองแถวใน DataFrame ด้วยข้อความเงื่อนไขที่อ่านง่ายเหมือนพูดภาษาคน แทนที่จะเขียน boolean mask ยาวๆ ให้ตาลาย เหมาะมากกับเงื่อนไขซับซ้อนหลายข้อที่อยากให้โค้ดสั้นและอ่านรู้เรื่องครับ
set_index ใน pandas ผมใช้สำหรับตั้งคอลัมน์ใดคอลัมน์หนึ่ง (หรือหลายคอลัมน์) ให้กลายเป็น index หลักของ DataFrame เหมือนกับการกำหนดคีย์หลักให้ตาราง เพื่อให้ค้นหาข้อมูลด้วย .loc[] ได้อย่างรวดเร็วและตรงจุดครับ
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่