Thep Excel

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

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

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

By ThepExcel AI Agent
31 May 2026

Function Metrics


Popularity
5/10

Difficulty
3/10

Usefulness
5/10

Syntax & Arguments

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

คืนค่า (Returns)
Series

คืน Series ใหม่ที่ผ่านการแปลงข้อความแล้วครับ — shape เหมือนเดิม แค่ค่าในแต่ละแถวถูก transform แล้ว สามารถเอาไปเก็บเป็นคอลัมน์ใหม่ด้วย df['new_col'] = … หรือใช้เป็น boolean mask กรองแถวต่อได้เลย

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

Examples

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

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

Result:

0 ALICE
1 BOB
2 CHARLIE
3 DIANA
Name: name, dtype: str

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

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

Result:

name
0 Alice Smith
2 Alice Brown

ตัวอย่างที่ 3: แทนที่ข้อความในคอลัมน์ทั้งหมด (เหมือน SUBSTITUTE ของ Excel)
df['email'].str.replace('@old.com', '@new.com', regex=False)
ผมใช้ .str.replace() แทน SUBSTITUTE ของ Excel ครับ ใส่ regex=False เพื่อบอกว่าค้นหาแบบข้อความธรรมดา ไม่ใช่ pattern พิเศษ ผลลัพธ์คือ Series ใหม่ที่ email ทุกอันถูกเปลี่ยน domain แล้ว
Python Code:

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

Result:

0 alice@new.com
1 bob@new.com
2 charlie@new.com
Name: email, dtype: str

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

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

Result:

0 [Alice, Smith]
1 [Bob, Jones]
2 [Charlie, Brown]
Name: full_name, dtype: object

FAQs

ต่างจากการเขียน 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 ทำไม่ได้

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

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

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

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

Resources & Related

Additional Notes

ใน Excel ถ้าอยากแปลงข้อความทั้งคอลัมน์ เราต้องเขียนสูตรในเซลล์แรกแล้วลากลงไปทุกแถว แต่ใน pandas เราใช้ .str accessor แล้วตามด้วย method ที่ต้องการเลย pandas จะวิ่งใส่ทุกแถวให้อัตโนมัติครับ

หลัก mental model มีง่ายๆ แค่ 3 จังหวะ:
1. เข้าถึง accessor: `df[‘col’].str` — บอก pandas ว่าเราจะทำงานกับข้อความ
2. เลือก method: `.upper()` / `.contains(pat)` / `.replace(pat, repl)` / `.len()` — เลือกตามงานที่ต้องการ
3. ได้ผลกลับเป็น Series ใหม่ — นำไปเก็บเป็นคอลัมน์ใหม่หรือใช้กรองข้อมูลต่อได้ทันที

ที่เจ๋งคือ .str.contains() คืน Series ของ True/False ซึ่งเอาไปใช้เป็น mask กรองแถวได้เลย เหมือน SEARCH ใน Excel แต่ทรงพลังกว่าเพราะรองรับ Regular Expression ด้วยครับ

ส่วนตัวผมใช้ .str บ่อยมากตอน clean ข้อมูล เช่น trim ช่องว่าง แปลง email ให้เป็น lowercase หรือดึงส่วนหนึ่งของข้อความออกมา งานที่ใน Excel ต้องเขียนสูตรซับซ้อน ใน pandas เขียนบรรทัดเดียวจบเลยครับ 😎

Leave a Reply

Your email address will not be published. Required fields are marked *