df.loc ใน pandas ผมใช้สำหรับเลือกข้อมูลจาก DataFrame โดยระบุ label ของแถวและคอลัมน์ ไม่ว่าจะเลือกแถวเดียว หลายแถว หรือกรองด้วยเงื่อนไข Boolean เหมือนการกด Ctrl+F ใน Excel แต่ทรงพลังกว่ามากครับ
df.loc[row_label] df.loc[row_label, col_label] df.loc[boolean_mask] df.loc[boolean_mask, [col1, col2]]
df.loc[row_label] df.loc[row_label, col_label] df.loc[boolean_mask] df.loc[boolean_mask, [col1, col2]]
DataFrame
ได้คืนเป็น DataFrame เมื่อ row selector เลือกหลายแถว และ column selector เลือกหลายคอลัมน์ครับ แต่ถ้า row selector เป็น label เดี่ยวจะได้ Series, ถ้าทั้ง row และ col เป็น scalar เดี่ยวจะได้ scalar โดยตรงเลย
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| row_label | label | slice | boolean array | callable | Yes | ระบุแถวที่ต้องการ — ใช้ชื่อ index เดี่ยว, slice ของชื่อ, array of boolean, หรือ callable ที่รับ DataFrame แล้ว return selector ก็ได้ | |
| col_label | label | list | slice | Optional | ทุกคอลัมน์ | ระบุคอลัมน์ที่ต้องการ — ถ้าไม่ใส่จะได้ทุกคอลัมน์ ใส่ชื่อเดี่ยวได้ Series ใส่ list ได้ DataFrame |
df.loc[df['age'] > 25]df.loc[df['age'] > 25]
name age salary
1 Bob 30 60000
2 Charlie 28 55000
3 David 35 80000
df.loc[df['salary'] >= 55000, ['name', 'salary']]df.loc[df['salary'] >= 55000, ['name', 'salary']]
name salary
1 Bob 60000
2 Charlie 55000
3 David 80000
df.loc['Bob']df.loc['Bob']
score 92
Name: Bob, dtype: int64
df.loc[(df['dept'] == 'IT') & (df['years'] >= 5)]df.loc[(df['dept'] == 'IT') & (df['years'] >= 5)]
dept salary years
1 IT 70000 5
3 IT 80000 7
ต่างกันที่ 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 แต่สะดวกกว่ามากครับ
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 ที่อาจเพี้ยนได้ถ้าลำดับเปลี่ยน 😎