0Pricing
Pandas & NumPy Academy · บทเรียน

การแยกและแทนที่สตริง

แยกสตริงออกเป็นหลายคอลัมน์ด้วย .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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แอตทริบิวต์ .str
  2. การแยกและแทนที่สตริง
  3. การจับคู่รูปแบบด้วย Regex
  4. การรวมและทำความสะอาดคอลัมน์ข้อความ
← กลับไปที่ Pandas & NumPy Academy