---
title: pandas loc — เลือกแถวและคอลัมน์ด้วย label
url: https://www.thepexcel.com/functions/python/selection/pandas-loc/
type: function-explainer
program: Python
syntax: "df.loc[row_label] df.loc[row_label, col_label] df.loc[boolean_mask] df.loc[boolean_mask, [col1, col2]]"
date: 2026-05-31
scores:
  popularity: 5
  difficulty: 3
  usefulness: 5
---

# pandas loc — เลือกแถวและคอลัมน์ด้วย label

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

## คำอธิบาย

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

## Syntax

```excel
df.loc[row_label] df.loc[row_label, col_label] df.loc[boolean_mask] df.loc[boolean_mask, [col1, col2]]
```

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| row_label | Yes | label \| slice \| boolean array \| callable |  | ระบุแถวที่ต้องการ — ใช้ชื่อ index เดี่ยว, slice ของชื่อ, array of boolean, หรือ callable ที่รับ DataFrame แล้ว return selector ก็ได้ |
| col_label | No | label \| list \| slice | ทุกคอลัมน์ | ระบุคอลัมน์ที่ต้องการ — ถ้าไม่ใส่จะได้ทุกคอลัมน์ ใส่ชื่อเดี่ยวได้ Series ใส่ list ได้ DataFrame |

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: กรองแถวด้วย Boolean mask

```excel
df.loc[df['age'] > 25]
```

**ผลลัพธ์:** `      name  age  salary
1      Bob   30   60000
2  Charlie   28   55000
3    David   35   80000`

ผมสร้าง Boolean mask จากเงื่อนไข df['age'] > 25 แล้วใส่เข้า loc — pandas จะคืนเฉพาะแถวที่ age มากกว่า 25 กลับมาเป็น DataFrame ครับ เหมือน AutoFilter ใน Excel แต่เขียนใน code ได้เลย Bob, Charlie, David ผ่านเงื่อนไข Alice ไม่ผ่านเพราะอายุ 24

### 2. ตัวอย่างที่ 2: เลือกแถวตามเงื่อนไข + เฉพาะบางคอลัมน์

```excel
df.loc[df['salary'] >= 55000, ['name', 'salary']]
```

**ผลลัพธ์:** `      name  salary
1      Bob   60000
2  Charlie   55000
3    David   80000`

คราวนี้ผมเพิ่ม argument ที่สองให้ loc เพื่อเลือกเฉพาะคอลัมน์ name กับ salary ครับ แถวที่ salary ≥ 55000 มีแค่ Charlie, David และ Bob — ผลลัพธ์ออกมาเป็น DataFrame สองคอลัมน์ ไม่มี age ให้รก

### 3. ตัวอย่างที่ 3: เลือกแถวด้วย label เดี่ยว (index เป็นชื่อ)

```excel
df.loc['Bob']
```

**ผลลัพธ์:** `score    92
Name: Bob, dtype: int64`

ตัวอย่างนี้ผมใช้ index ที่เป็นชื่อคนครับ df.loc['Bob'] คืนทุก column ของแถว Bob กลับมาเป็น Series — ค่า index คือชื่อคอลัมน์ ค่า value คือข้อมูลในแถวนั้น ถ้าเปรียบกับ Excel ก็เหมือน VLOOKUP แบบหาชื่อแล้วดึงข้อมูลในแถวนั้นออกมาเลย

### 4. ตัวอย่างที่ 4: กรองด้วยหลายเงื่อนไขพร้อมกัน

```excel
df.loc[(df['dept'] == 'IT') & (df['years'] >= 5)]
```

**ผลลัพธ์:** `  dept  salary  years
1   IT   70000      5
3   IT   80000      7`

ผมรวมสองเงื่อนไขด้วย & (AND) ครับ ต้องใส่ () ครอบแต่ละเงื่อนไขด้วย มิฉะนั้น Python จะ error เพราะ operator precedence ผลลัพธ์คือแถวที่เป็น IT และมีประสบการณ์ 5 ปีขึ้นไป ถ้าอยากได้ OR ใช้ | แทนครับ

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

- 💡 ถ้าเลือกคอลัมน์เดี่ยวด้วย loc เช่น df.loc[:, 'name'] จะได้ Series ไม่ใช่ DataFrame ครับ ถ้าอยากได้ DataFrame ให้ใส่ list แทน: df.loc[:, ['name']] — สังเกต [ ] ชั้นในครับ

- ผมแนะนำให้ใช้ loc แทน chained indexing เช่น df[df['age']>25]['name'] ครับ เพราะ pandas อาจ warning ว่า SettingWithCopyWarning และบางครั้ง assignment จะไม่ทำงานอย่างที่คิด df.loc[df['age']>25, 'name'] ปลอดภัยกว่าชัวร์ๆ เลย

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

**Q: loc ต่างจาก iloc ยังไงครับ?**

ต่างกันที่ loc ใช้ label (ชื่อ index / ชื่อคอลัมน์) ส่วน iloc ใช้ตำแหน่งตัวเลข 0-based ครับ เช่น df.loc['Alice'] กับ df.iloc[0] อาจได้แถวเดียวกัน แต่ถ้าเราเรียงลำดับ DataFrame ใหม่ iloc[0] จะได้แถวอื่น ส่วน loc['Alice'] ยังได้ Alice อยู่เสมอ ผมเลยชอบ loc มากกว่าเพราะ predictable กว่าครับ

**Q: ทำไมต้องใส่วงเล็บ () ครอบเงื่อนไขตอนใช้ & หรือ | ใน loc?**

เพราะ Python มี operator precedence ครับ & และ | มี priority ต่ำกว่า == และ > ถ้าไม่ใส่ () Python จะตีความผิดและ throw error หรือได้ผลผิดพลาด ผมจำง่ายๆ ว่า 'แต่ละเงื่อนไขต้องมีวงเล็บครอบ' เช่น (df['a'] > 1) & (df['b'] == 'X') ครับ

**Q: loc กับการ assign ค่าใหม่ใช้ได้ไหม?**

ได้เลยครับ! df.loc[df['status'] == 'inactive', 'score'] = 0 จะ set ค่า score เป็น 0 ทุกแถวที่ status เป็น inactive ผมใช้แบบนี้บ่อยมากตอนต้องการแก้ไขข้อมูลบางส่วนโดยไม่กระทบแถวอื่น คล้ายกับใช้ IF + range ใน Excel แต่สะดวกกว่ามากครับ

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

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

---

_Source: [https://www.thepexcel.com/functions/python/selection/pandas-loc/](https://www.thepexcel.com/functions/python/selection/pandas-loc/)_
