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 คือไม่สนตัวพิมพ์ใหญ่เล็ก |
[ ] = อาร์กิวเมนต์ที่ไม่บังคับ
ใน 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 เขียนบรรทัดเดียวจบเลยครับ 😎
ผมใช้ .str.upper() แทน UPPER() ของ Excel ครับ ต่างกันตรงที่ Excel ต้องเขียนสูตรแล้วลากทีละเซลล์ แต่บรรทัดนี้จะแปลงทุกชื่อในคอลัมน์ให้เป็นตัวพิมพ์ใหญ่หมดเลยในคราวเดียว
อันนี้ผมโปรดครับ — .str.contains('Alice') คืน Series ของ True/False แบบเดียวกับ SEARCH ใน Excel แต่ผมใช้มันเป็น mask กรองแถวได้เลยโดยใส่ไว้ใน df[…] ได้เฉพาะแถวที่ชื่อมีคำว่า Alice ออกมาทันที ไม่ต้องเขียน IF แยก
ผมใช้ .str.replace() แทน SUBSTITUTE ของ Excel ครับ ใส่ regex=False เพื่อบอกว่าค้นหาแบบข้อความธรรมดา ไม่ใช่ pattern พิเศษ ผลลัพธ์คือ Series ใหม่ที่ email ทุกอันถูกเปลี่ยน domain แล้ว
ผมใช้ .str.split(' ') เพื่อตัดชื่อเต็มออกเป็น list ของ first name กับ last name ครับ ได้ผลเหมือนใช้ Text to Columns ใน Excel เลย แต่ทำในโค้ดได้เลยไม่ต้องผ่าน UI นอกจากนี้ยังมี .str.len() สำหรับนับจำนวนตัวอักษรแบบ LEN ของ Excel ด้วยครับ
ผลลัพธ์เหมือนกันครับ แต่ .str.upper() เร็วกว่ามากเพราะ pandas ทำงานแบบ vectorized (C-level loop) ส่วน .apply(lambda) เป็น Python loop ทีละแถว ข้อมูล 1 ล้านแถว .str จะเร็วกว่า apply หลายเท่าตัวเลยครับ ผมเลยใช้ .str เป็น default และเลือก .apply เฉพาะตอนต้องการ logic ที่ .str ทำไม่ได้
ค่า default ของ .str.contains() คือ regex=True ครับ หมายความว่าถ้าใส่ pattern พิเศษอย่าง 'alice|bob' มันจะค้นหาแบบ regex เลย แต่ถ้าต้องการค้นหาข้อความธรรมดา (ไม่ใช่ regex) ให้ใส่ regex=False ด้วย ผมลืมใส่แล้วงงว่าทำไมผลไม่ถูกก็มีนะครับ 😅
ปกติ .str methods จะคืน NaN กลับมาสำหรับแถวที่เป็น NaN ครับ ไม่ error แต่ถ้าใช้ .str.contains() จะได้ NaN แทน True/False ซึ่งพอเอาไปกรองแถวจะ error ได้ วิธีแก้คือใส่ na=False ไปด้วย เช่น df['col'].str.contains('word', na=False) แล้วแถว NaN จะถูกนับเป็น False แทนครับ
ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas .str จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
apply ใน pandas ผมใช้สำหรับรันฟังก์ชันกับแต่ละแถวหรือแต่ละคอลัมน์ใน DataFrame หรือรันกับแต่ละค่าใน Series ตอนที่ต้องการ logic ซับซ้อนที่ vectorized operations ทำไม่ได้ครับ
astype ใน pandas ผมใช้สำหรับแปลงประเภทข้อมูล (dtype) ของคอลัมน์หรือ DataFrame เช่น จาก object เป็น int หรือ float เป็น str ทำให้คำนวณได้ถูกต้องและประหยัด memory มากขึ้นครับ
query ใน pandas ผมใช้กรองแถวใน DataFrame ด้วยข้อความเงื่อนไขที่อ่านง่ายเหมือนพูดภาษาคน แทนที่จะเขียน boolean mask ยาวๆ ให้ตาลาย เหมาะมากกับเงื่อนไขซับซ้อนหลายข้อที่อยากให้โค้ดสั้นและอ่านรู้เรื่องครับ
replace ใน pandas ผมใช้สำหรับแทนที่ค่าหนึ่งด้วยอีกค่าหนึ่งทั้ง DataFrame หรือ Series เหมาะกับงาน cleaning ข้อมูล ใครเคยใช้ Find & Replace (Ctrl+H) ใน Excel มาก่อน บอกเลยว่าตัวนี้คือพี่น้องกันเลยครับ
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่