การแยกและแทนที่สตริง
แยกสตริงออกเป็นหลายคอลัมน์ด้วย .str.split(expand=True) และแทนที่ส่วนย่อยของสตริงด้วย .str.replace()
การแยกและแทนที่สตริง เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
การแยกสตริงเป็นรายการ
.str.split(sep) จะแยกแต่ละสตริงใน Series ทุกครั้งที่พบตัวคั่น และส่งคืน Series ที่ประกอบด้วยรายการ หากไม่ใช้ expand=True แต่ละองค์ประกอบจะเป็นรายการ Python ซึ่งมีประโยชน์สำหรับการนับโทเค็นหรือการประมวลผลระดับรายการเพิ่มเติม ตัวคั่นอาจเป็นสตริงตามตัวอักษรหรือรูปแบบ regex
import pandas as pd
df = pd.DataFrame({'tags': ['python,data,pandas', 'ml,ai', 'sql,db,query']})
# Split into a list of strings
df['tag_list'] = df['tags'].str.split(',')
print(df['tag_list'])
# 0 [python, data, pandas]
# 1 [ml, ai]
# 2 [sql, db, query]
# Count tags per row
df['tag_count'] = df['tag_list'].str.len()
print(df['tag_count'].tolist()) # [3, 2, 3]ใช้ expand=True เพื่อแยกเป็นคอลัมน์
การส่ง expand=True ให้กับ .str.split() จะส่งคืน DataFrame แทน Series ของรายการ โดยโทเค็นที่แยกได้แต่ละรายการจะกลายเป็นคอลัมน์ของตนเอง (คอลัมน์ 0, 1, 2, …) นี่เป็นวิธีมาตรฐานในการ ขยายคอลัมน์ที่มีตัวคั่น เช่น แยกชื่อเต็ม 'first last' ออกเป็นคอลัมน์ชื่อและนามสกุล
import pandas as pd
df = pd.DataFrame({'full_name': ['Alice Smith', 'Bob Jones', 'Carol White']})
# Split into two columns
name_parts = df['full_name'].str.split(' ', expand=True)
name_parts.columns = ['first_name', 'last_name']
df = pd.concat([df, name_parts], axis=1)
print(df)
# full_name first_name last_name
# 0 Alice Smith Alice Smith
# 1 Bob Jones Bob Jones
# 2 Carol White Carol Whiteจำกัดจำนวนครั้งในการแยกด้วย n=
พารามิเตอร์ n จะจำกัดจำนวนครั้งสูงสุดที่แยกได้ .str.split(sep, n=1) จะแยกได้ไม่เกินหนึ่งครั้ง ทำให้เกิดส่วนประกอบได้ไม่เกินสองส่วน วิธีนี้มีประโยชน์เมื่อคุณต้องการเพียงส่วนแรกของสตริง และสามารถเก็บส่วนที่เหลือไว้ด้วยกันได้ เช่น แยกโดเมนจากอีเมลโดยแยกที่ '@'
import pandas as pd
df = pd.DataFrame({'email': ['alice@example.com', 'bob@work.org', 'carol@test.net']})
# Split at '@', keep only the first split
parts = df['email'].str.split('@', n=1, expand=True)
df['username'] = parts[0]
df['domain'] = parts[1]
print(df[['username', 'domain']])
# username domain
# 0 alice example.com
# 1 bob work.org
# 2 carol test.netใช้ rsplit() เพื่อแยกจากด้านขวา
.str.rsplit(sep, n=1) จะแยกจากด้านขวาของสตริง วิธีนี้มีประโยชน์เมื่อต้องการส่วนประกอบสุดท้าย เช่น แยกนามสกุลไฟล์จากเส้นทางโดยแยกที่จุดสุดท้าย เมื่อใช้ร่วมกับ expand=True จะสร้างสองคอลัมน์ ได้แก่ ทุกอย่างก่อนตัวคั่นสุดท้าย และทุกอย่างหลังตัวคั่นนั้น
import pandas as pd
df = pd.DataFrame({'filepath': ['data/raw/sales.csv', 'data/clean/orders.xlsx', 'reports/q1.pdf']})
# Split on the last '/' to separate directory from filename
parts = df['filepath'].str.rsplit('/', n=1, expand=True)
df['directory'] = parts[0]
df['filename'] = parts[1]
print(df[['directory', 'filename']])
# directory filename
# 0 data/raw sales.csv
# 1 data/clean orders.xlsx
# 2 reports q1.pdfใช้ .str.replace() เพื่อแทนที่สตริงย่อย
.str.replace(pat, repl) จะแทนที่ทุกตำแหน่งที่พบรูปแบบในแต่ละสตริง โดยค่าเริ่มต้น pat จะถูกตีความเป็นนิพจน์ทั่วไป ดังนั้นให้ส่ง regex=False หากต้องการแทนที่สตริงตามตัวอักษร ค่าที่ใช้แทนอาจเป็นสตริงคงที่หรือการอ้างอิงย้อนกลับของ regex ให้ใช้วิธีนี้สำหรับการแทนที่แบบเวกเตอร์เสมอ แทนการวนซ้ำด้วยลูป Python
import pandas as pd
df = pd.DataFrame({'price': ['$1,200.50', '$800.00', '$3,450.75']})
# Remove dollar sign and commas
df['price_clean'] = (
df['price']
.str.replace('$', '', regex=False) # literal $
.str.replace(',', '', regex=False) # literal comma
)
df['price_float'] = df['price_clean'].astype(float)
print(df)
# price price_clean price_float
# 0 $1,200.50 1200.50 1200.5
# 1 $800.00 800.00 800.0
# 2 $3,450.75 3450.75 3450.75การแทนที่ด้วยรูปแบบ Regex
เมื่อส่ง regex=True (ค่าเริ่มต้น) รูปแบบจะเป็นนิพจน์ทั่วไป และค่าที่ใช้แทนอาจมีการอ้างอิงย้อนกลับ เช่น r'\1' เพื่ออ้างถึงกลุ่มที่จับไว้ วิธีนี้ช่วยให้แปลงข้อความได้อย่างทรงพลัง เช่น จัดรูปแบบวันที่ใหม่ ปรับหมายเลขโทรศัพท์ให้เป็นมาตรฐาน หรือแยกข้อมูลที่มีโครงสร้างจากข้อความอิสระ
import pandas as pd
df = pd.DataFrame({'date': ['01-15-2024', '03-20-2024', '07-04-2024']})
# Reformat from MM-DD-YYYY to YYYY-MM-DD using groups
df['date_iso'] = df['date'].str.replace(
r'(\d{2})-(\d{2})-(\d{4})',
r'\3-\1-\2',
regex=True
)
print(df)
# date date_iso
# 0 01-15-2024 2024-01-15
# 1 03-20-2024 2024-03-20
# 2 07-04-2024 2024-07-04การนับจำนวนการแทนที่
บางครั้งคุณอาจต้องการตรวจสอบว่ามีค่ากี่ค่าที่ถูกแก้ไขจริงจากการแทนที่ ให้เปรียบเทียบ Series เดิมกับ Series หลังการแทนที่ แล้วนับแถวที่เกิดการเปลี่ยนแปลง ขั้นตอนการตรวจสอบนี้ยืนยันว่ารูปแบบการแทนที่ตรงตามที่คาดไว้ และช่วยตรวจจับข้อผิดพลาดของ regex ได้ตั้งแต่เนิ่น ๆ
import pandas as pd
df = pd.DataFrame({'text': ['foo bar', 'hello foo', 'world', 'foo foo']})
original = df['text'].copy()
df['text'] = df['text'].str.replace('foo', 'baz', regex=False)
changed = (df['text'] != original).sum()
print(f'{changed} rows were modified') # 3
print(df['text'].tolist())
# ['baz bar', 'hello baz', 'world', 'baz baz']การแทนที่หลายรูปแบบด้วยลูป
เมื่อจำเป็นต้องใช้การแทนที่หลายรายการ (เช่น ทำให้อักษรย่อหลายสิบรายการเป็นมาตรฐาน) ให้วนซ้ำผ่านพจนานุกรมการจับคู่และใช้การแทนที่แต่ละรายการตามลำดับ วิธีนี้ดูแลรักษาได้ง่ายกว่า regex แบบสลับทางเลือกที่ซับซ้อนรายการเดียว ให้สร้างการจับคู่จากกฎทางธุรกิจหรือตารางค้นหา
import pandas as pd
df = pd.DataFrame({'dept': ['Eng', 'Engg', 'HR', 'Human Resources', 'Mktg', 'Marketing']})
# Standardisation map
substitutions = {
'Engg': 'Engineering',
'Eng': 'Engineering',
'Human Resources': 'HR',
'Mktg': 'Marketing'
}
for old, new in substitutions.items():
df['dept'] = df['dept'].str.replace(old, new, regex=False)
print(df['dept'].tolist())
# ['Engineering', 'Engineering', 'HR', 'HR', 'Marketing', 'Marketing']การนำส่วนที่แยกไว้กลับมาต่อกัน
หลังจากแยกแล้ว คุณอาจต้องนำส่วนต่าง ๆ มารวมกันอีกครั้ง สำหรับ Series ที่ประกอบด้วยรายการ ให้ใช้ .str.join(separator) เพื่อต่อองค์ประกอบในรายการให้เป็นสตริงเดียวต่อแถว หากต้องการต่อค่าข้ามคอลัมน์ ให้ใช้การต่อสตริงมาตรฐานด้วย + และ .astype(str)
import pandas as pd
df = pd.DataFrame({'parts': [['alpha', 'beta'], ['foo', 'bar', 'baz']]})
# Join list elements with a hyphen
df['joined'] = df['parts'].str.join('-')
print(df['joined'])
# 0 alpha-beta
# 1 foo-bar-bazการปรับช่องว่างให้เป็นมาตรฐาน
งานทำความสะอาดข้อความที่พบบ่อยคือการยุบช่องว่างที่อยู่ติดกันหลายช่องให้เหลือช่องว่างเดียว ปัญหานี้มักเกิดในข้อความที่ดึงจากเว็บ ซึ่งการเว้นวรรคใน HTML หรือการคัดลอกและวางทำให้มีช่องว่างเกินมา รูปแบบ regex r'\s+' จะจับอักขระช่องว่างตั้งแต่หนึ่งตัวขึ้นไปและแทนที่ทั้งหมดด้วยช่องว่างเดียว จากนั้น .str.strip() จะลบช่องว่างด้านหน้าและด้านหลัง
import pandas as pd
df = pd.DataFrame({'address': ['123 Main St', ' 456 Oak Ave ', '789 Pine St']})
df['address_clean'] = (
df['address']
.str.replace(r'\s+', ' ', regex=True)
.str.strip()
)
print(df['address_clean'].tolist())
# ['123 Main St', '456 Oak Ave', '789 Pine St']ภาคปฏิบัติ: แยกวิเคราะห์คอลัมน์สตริงที่มีโครงสร้าง
ต่อไปนี้คือตัวอย่างที่สมจริง ซึ่งคอลัมน์เดียวมีข้อมูลที่มีโครงสร้าง เช่น 'Alice:25:Engineer' เราจะแยกโดยใช้ตัวคั่น ตั้งชื่อคอลัมน์ที่ได้ และแปลงแต่ละคอลัมน์เป็นชนิดข้อมูลที่เหมาะสม เป็นกระบวนการแยกวิเคราะห์และแปลงชนิดข้อมูลอย่างสมบูรณ์โดยใช้เพียง .str.split() และ astype()
import pandas as pd
df = pd.DataFrame({'record': ['Alice:25:Engineer', 'Bob:34:Manager', 'Carol:28:Analyst']})
parts = df['record'].str.split(':', expand=True)
parts.columns = ['name', 'age', 'role']
parts['age'] = parts['age'].astype(int)
result = pd.concat([df, parts], axis=1)
print(result)
# record name age role
# 0 Alice:25:Engineer Alice 25 Engineer
# 1 Bob:34:Manager Bob 34 Manager
# 2 Carol:28:Analyst Carol 28 Analystตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจเกี่ยวกับการแยกและการแทนที่สตริง
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า str.split(sep, expand=True) จะขยายคอลัมน์ที่มีตัวคั่นเป็นหลายคอลัมน์ n= จะจำกัดจำนวนครั้งที่แยก str.rsplit() จะแยกจากด้านขวา และ str.replace() จะแทนที่รูปแบบต่าง ๆ (พร้อมรองรับ regex) เชื่อมการดำเนินการแยกและแทนที่เข้ากับ strip และ lower เพื่อสร้างกระบวนการปรับข้อความให้เป็นมาตรฐานอย่างครบถ้วน ต่อไปเราจะใช้รูปแบบ regex เพื่อแยกและจับคู่สตริงย่อย
คำถามที่พบบ่อย
บทเรียน “การแยกและแทนที่สตริง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การแยกและแทนที่สตริง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การแยกและแทนที่สตริง”
แยกสตริงออกเป็นหลายคอลัมน์ด้วย .str.split(expand=True) และแทนที่ส่วนย่อยของสตริงด้วย .str.replace() คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การแยกและแทนที่สตริง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม
ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- แอตทริบิวต์ .str
- การแยกและแทนที่สตริง
- การจับคู่รูปแบบด้วย Regex
- การรวมและทำความสะอาดคอลัมน์ข้อความ