Thep Excel

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

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

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

ความนิยม5/10
ความยาก3/10
ประโยชน์5/10

อัปเดต 31 May 2026

Syntax & Arguments

คืนค่าSeries

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

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

[ ] = อาร์กิวเมนต์ที่ไม่บังคับ

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 เขียนบรรทัดเดียวจบเลยครับ 😎

Examples

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

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

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

ผลลัพธ์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 แยก

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

ผลลัพธ์ 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 แล้ว

>_
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
ตัวอย่างที่ 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 ด้วยครับ

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

ผลลัพธ์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

ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas .str จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้pandas .strTransform
Transform (2)
pandas apply

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

pandas astype

astype ใน pandas ผมใช้สำหรับแปลงประเภทข้อมูล (dtype) ของคอลัมน์หรือ DataFrame เช่น จาก object เป็น int หรือ float เป็น str ทำให้คำนวณได้ถูกต้องและประหยัด memory มากขึ้นครับ

Selection (1)
pandas query

query ใน pandas ผมใช้กรองแถวใน DataFrame ด้วยข้อความเงื่อนไขที่อ่านง่ายเหมือนพูดภาษาคน แทนที่จะเขียน boolean mask ยาวๆ ให้ตาลาย เหมาะมากกับเงื่อนไขซับซ้อนหลายข้อที่อยากให้โค้ดสั้นและอ่านรู้เรื่องครับ

Cleaning (1)
pandas replace

replace ใน pandas ผมใช้สำหรับแทนที่ค่าหนึ่งด้วยอีกค่าหนึ่งทั้ง DataFrame หรือ Series เหมาะกับงาน cleaning ข้อมูล ใครเคยใช้ Find & Replace (Ctrl+H) ใน Excel มาก่อน บอกเลยว่าตัวนี้คือพี่น้องกันเลยครับ

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่