---
title: pandas apply — รันฟังก์ชันกับทุกแถวหรือทุกคอลัมน์
url: https://www.thepexcel.com/functions/python/transform/pandas-apply/
type: function-explainer
program: Python
syntax: "df.apply(func, axis)"
date: 2026-05-31
scores:
  popularity: 5
  difficulty: 3
  usefulness: 5
---

# pandas apply — รันฟังก์ชันกับทุกแถวหรือทุกคอลัมน์

> apply ใน pandas ผมใช้สำหรับรันฟังก์ชันกับแต่ละแถวหรือแต่ละคอลัมน์ใน DataFrame หรือรันกับแต่ละค่าใน S

## คำอธิบาย

apply ใน pandas ผมใช้สำหรับรันฟังก์ชันกับแต่ละแถวหรือแต่ละคอลัมน์ใน DataFrame หรือรันกับแต่ละค่าใน Series ตอนที่ต้องการ logic ซับซ้อนที่ vectorized operations ทำไม่ได้ครับ

## Syntax

```excel
df.apply(func, axis)
```

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| func | Yes | callable |  | ฟังก์ชันที่จะรัน รับได้ทั้ง lambda, def function, หรือ numpy function เช่น np.sqrt |
| axis | No | int \| str | 0 | 0 หรือ 'index' = รันต่อคอลัมน์ (ค่า default), 1 หรือ 'columns' = รันต่อแถว ผมใช้ axis=1 บ่อยกว่าครับตอนอยากคำนวณข้ามคอลัมน์ |
| raw | No | bool | False | False = ส่ง Series เข้าฟังก์ชัน, True = ส่ง ndarray แทน เร็วกว่าถ้าใช้ numpy functions ที่รับ array โดยตรง |
| result_type | No | str \| None | None | ใช้ได้เฉพาะ axis=1: 'expand' แปลง list เป็นหลายคอลัมน์, 'reduce' บีบเป็น Series, 'broadcast' คงรูปต้นฉบับ |
| args | No | tuple | () | arguments เพิ่มเติมที่จะส่งเข้าฟังก์ชัน ตามหลัง argument หลักที่ apply ส่งให้อัตโนมัติ |

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: apply บน Series ด้วย lambda (element-wise)

```excel
s.apply(lambda v: v * 2)
```

**ผลลัพธ์:** `0    20
1    40
2    60
3    80
dtype: int64`

ผมรัน lambda กับแต่ละค่าใน Series ครับ แต่ละตัวจะถูก *2 ทีละค่า ได้ Series ใหม่ออกมา 20, 40, 60, 80 โน้ต: ตัวอย่างนี้ vectorized เร็วกว่า (`s * 2`) แต่เป็นจุดเริ่มต้นที่ดีเพื่อเข้าใจว่า apply ทำอะไรครับ

### 2. ตัวอย่างที่ 2: apply กับ named function บน Series

```excel
s.apply(categorize)
```

**ผลลัพธ์:** `0     ราคาถูก
1    ราคากลาง
2     ราคาแพง
3     ราคาถูก
4     ราคาแพง
dtype: str`

คราวนี้ผมใช้ฟังก์ชันที่ตั้งชื่อไว้แล้ว (named function) แทน lambda ครับ มีประโยชน์ตอน logic ซับซ้อนเกิน 1 บรรทัด เช่น จัดหมวดหมู่ราคา ผลลัพธ์เป็น Series ของ string 'ราคาถูก' / 'ราคากลาง' / 'ราคาแพง' แต่ละตัวตรงกับค่าตั้นต้น

### 3. ตัวอย่างที่ 3: apply บน DataFrame แบบ row-wise ด้วย axis=1

```excel
df.apply(lambda row: row['base_price'] * (1 - row['discount_pct'] / 100), axis=1)
```

**ผลลัพธ์:** `0     90.0
1    190.0
2    240.0
dtype: float64`

นี่คือกรณีที่ผมใช้ apply บ่อยที่สุดครับ ตอนต้องคำนวณข้ามหลายคอลัมน์ในแถวเดียว ด้วย axis=1 แต่ละ row จะถูกส่งเข้า lambda เป็น Series และเรา access คอลัมน์ได้ด้วย row['ชื่อ'] ได้ราคาหลังหักส่วนลดออกมาเป็น Series ครับ

### 4. ตัวอย่างที่ 4: apply บน DataFrame แบบ column-wise ด้วย axis=0 (default)

```excel
df.apply(lambda col: col.max() - col.min())
```

**ผลลัพธ์:** `score_A    20
score_B    35
dtype: int64`

ตอน axis=0 (ค่า default) แต่ละ "คอลัมน์" จะถูกส่งเข้าฟังก์ชันเป็น Series ครับ ผมใช้หา range (ค่าสูงสุด - ต่ำสุด) ของแต่ละคอลัมน์คะแนน ได้ผลออกมาเป็น Series ที่ index คือชื่อคอลัมน์

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

- 💡 ก่อนเขียน apply ผมลองถามตัวเองก่อนเสมอว่า "ทำด้วย vectorized ได้ไหม?" เช่น df['col'] * 2 หรือ np.where() เพราะเร็วกว่า apply มากครับ ถ้าทำได้ก็ไม่ต้อง apply เลย

- ถ้าต้องการ apply กับ DataFrame แบบ row-wise แต่ฟังก์ชันรับ numpy array ได้ ลองใส่ raw=True ดูครับ pandas จะส่ง ndarray แทน Series ทำให้เร็วขึ้นได้นิดนึง เพราะไม่ต้องสร้าง Series object ทุกแถว

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

**Q: apply ช้าแค่ไหน เทียบกับ vectorized operations?**

ช้ากว่าเยอะมากครับ 😅 apply วน loop ใน Python ทีละแถว ถ้าข้อมูล 1 ล้านแถว vectorized operations เสร็จในหลัก milliseconds แต่ apply อาจใช้เวลาหลายวินาทีเลย ผมเลยใช้ apply เฉพาะตอนที่ logic ซับซ้อนจริงๆ เช่น ต้องเงื่อนไข if-else หลายชั้น หรือ call ฟังก์ชัน external ที่ไม่รับ array ครับ

**Q: ต่างจาก applymap (หรือ map) ยังไง?**

apply ส่ง Series เข้าฟังก์ชัน (ทั้งแถวหรือทั้งคอลัมน์) ครับ ส่วน map ใน Series และ applymap (เปลี่ยนชื่อเป็น map ใน pandas 2.1+) ส่งค่าแต่ละ cell เข้าทีละค่าเลย ผมใช้ .map() ตอนอยากเปลี่ยนค่าแต่ละ cell อย่างเดียวโดยไม่ต้องเห็นแถวรอบข้าง และใช้ apply ตอนต้องคำนวณข้ามคอลัมน์ในแถวเดียวกันครับ

**Q: ส่ง argument เพิ่มเติมเข้าฟังก์ชันได้ไหม?**

ได้เลยครับ ใช้ parameter args=(val1, val2) เพื่อส่ง positional args เพิ่ม หรือส่งเป็น **kwargs ก็ได้ เช่น df['price'].apply(add_tax, args=(0.07,)) ถ้าเขียนฟังก์ชัน add_tax(price, tax_rate) ไว้ครับ

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

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

---

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