---
title: pandas .str — จัดการข้อความทั้งคอลัมน์ทีเดียว
url: https://www.thepexcel.com/functions/python/transform/pandas-str/
type: function-explainer
program: Python
syntax: "df['col'].str.method()"
date: 2026-05-31
scores:
  popularity: 5
  difficulty: 3
  usefulness: 5
---

# pandas .str — จัดการข้อความทั้งคอลัมน์ทีเดียว

> pandas .str accessor ทำให้ผมใช้ text functions อย่าง upper, replace, contains กับทุกแถวในคอลัมน์พร้อ

## คำอธิบาย

pandas .str accessor ทำให้ผมใช้ text functions อย่าง upper, replace, contains กับทุกแถวในคอลัมน์พร้อมกันบรรทัดเดียว เหมือนได้ UPPER/SUBSTITUTE/SEARCH ของ Excel แต่ไม่ต้องลากสูตรทีละเซลล์ครับ

## Syntax

```excel
df['col'].str.method()
```

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| pat | Yes | str |  | ข้อความหรือ pattern ที่ต้องการค้นหา ใช้กับ .str.contains(pat) และ .str.replace(pat, repl) |
| repl | No | str |  | ข้อความที่ใช้แทนที่ ใช้กับ .str.replace(pat, repl) — ตรงกับ argument ที่สองของ SUBSTITUTE ใน Excel |
| case | No | bool | True | ใช้กับ .str.contains() — True คือ case-sensitive (ค่า default), False คือไม่สนตัวพิมพ์ใหญ่เล็ก |

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: แปลงชื่อเป็นตัวพิมพ์ใหญ่ทั้งคอลัมน์ (เหมือน UPPER ของ Excel)

```excel
df['name'].str.upper()
```

**ผลลัพธ์:** `0      ALICE
1        BOB
2    CHARLIE
3      DIANA
Name: name, dtype: str`

ผมใช้ .str.upper() แทน UPPER() ของ Excel ครับ ต่างกันตรงที่ Excel ต้องเขียนสูตรแล้วลากทีละเซลล์ แต่บรรทัดนี้จะแปลงทุกชื่อในคอลัมน์ให้เป็นตัวพิมพ์ใหญ่หมดเลยในคราวเดียว

### 2. ตัวอย่างที่ 2: ค้นหาแถวที่มีคำที่ต้องการ (เหมือน SEARCH + IF ของ Excel)

```excel
df[df['name'].str.contains('Alice')]
```

**ผลลัพธ์:** `          name
0  Alice Smith
2  Alice Brown`

อันนี้ผมโปรดครับ — .str.contains('Alice') คืน Series ของ True/False แบบเดียวกับ SEARCH ใน Excel แต่ผมใช้มันเป็น mask กรองแถวได้เลยโดยใส่ไว้ใน df[...] ได้เฉพาะแถวที่ชื่อมีคำว่า Alice ออกมาทันที ไม่ต้องเขียน IF แยก

### 3. ตัวอย่างที่ 3: แทนที่ข้อความในคอลัมน์ทั้งหมด (เหมือน SUBSTITUTE ของ Excel)

```excel
df['email'].str.replace('@old.com', '@new.com', regex=False)
```

**ผลลัพธ์:** `0      alice@new.com
1        bob@new.com
2    charlie@new.com
Name: email, dtype: str`

ผมใช้ .str.replace() แทน SUBSTITUTE ของ Excel ครับ ใส่ regex=False เพื่อบอกว่าค้นหาแบบข้อความธรรมดา ไม่ใช่ pattern พิเศษ ผลลัพธ์คือ Series ใหม่ที่ email ทุกอันถูกเปลี่ยน domain แล้ว

### 4. ตัวอย่างที่ 4: นับความยาวข้อความและตัดคำด้วย split (เหมือน LEN + ใช้งานได้เหมือน Text to Columns)

```excel
df['full_name'].str.split(' ')
```

**ผลลัพธ์:** `0      [Alice, Smith]
1        [Bob, Jones]
2    [Charlie, Brown]
Name: full_name, dtype: object`

ผมใช้ .str.split(' ') เพื่อตัดชื่อเต็มออกเป็น list ของ first name กับ last name ครับ ได้ผลเหมือนใช้ Text to Columns ใน Excel เลย แต่ทำในโค้ดได้เลยไม่ต้องผ่าน UI นอกจากนี้ยังมี .str.len() สำหรับนับจำนวนตัวอักษรแบบ LEN ของ Excel ด้วยครับ

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

- 💡 ผมแนะนำให้ใช้ .str.strip() ก่อนเสมอตอน clean ข้อมูลครับ — ช่องว่างหน้าหลังข้อความเป็นตัวการทำให้ groupby หรือ merge ไม่ match กันทั้งที่ข้อมูลดูเหมือนเหมือนกัน แค่บรรทัดเดียวช่วยชีวิตได้เยอะมาก

- ส่วนตัวผมชอบ chain หลาย .str methods ต่อกันครับ เช่น df['email'].str.strip().str.lower() เพื่อ trim ช่องว่างแล้วแปลงเป็น lowercase ในคำสั่งเดียว อ่านง่ายและกระชับดีครับ

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

**Q: ต่างจากการเขียน df['col'].apply(lambda x: x.upper()) ยังไง?**

ผลลัพธ์เหมือนกันครับ แต่ .str.upper() เร็วกว่ามากเพราะ pandas ทำงานแบบ vectorized (C-level loop) ส่วน .apply(lambda) เป็น Python loop ทีละแถว ข้อมูล 1 ล้านแถว .str จะเร็วกว่า apply หลายเท่าตัวเลยครับ ผมเลยใช้ .str เป็น default และเลือก .apply เฉพาะตอนต้องการ logic ที่ .str ทำไม่ได้

**Q: .str.contains() กับ regex ใช้งานยังไง?**

ค่า default ของ .str.contains() คือ regex=True ครับ หมายความว่าถ้าใส่ pattern พิเศษอย่าง 'alice|bob' มันจะค้นหาแบบ regex เลย แต่ถ้าต้องการค้นหาข้อความธรรมดา (ไม่ใช่ regex) ให้ใส่ regex=False ด้วย ผมลืมใส่แล้วงงว่าทำไมผลไม่ถูกก็มีนะครับ 😅

**Q: ถ้าในคอลัมน์มีค่า NaN จะเกิดอะไรขึ้น?**

ปกติ .str methods จะคืน NaN กลับมาสำหรับแถวที่เป็น NaN ครับ ไม่ error แต่ถ้าใช้ .str.contains() จะได้ NaN แทน True/False ซึ่งพอเอาไปกรองแถวจะ error ได้ วิธีแก้คือใส่ na=False ไปด้วย เช่น df['col'].str.contains('word', na=False) แล้วแถว NaN จะถูกนับเป็น False แทนครับ

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

- [pandas Series.str accessor (official docs)](https://pandas.pydata.org/docs/reference/api/pandas.Series.str.html) _(article)_

---

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