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

การรวมและทำความสะอาดคอลัมน์ข้อความ

ต่อหลายคอลัมน์เป็นสตริงเดียว ลบช่องว่างส่วนเกิน และปรับป้ายกำกับหมวดหมู่ที่ไม่สอดคล้องกันให้เป็นมาตรฐาน

บทเรียน 4 จาก 413 ขั้นตอน

การรวมและทำความสะอาดคอลัมน์ข้อความ เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

การต่อคอลัมน์ข้อความ

งานเตรียมข้อมูลที่พบบ่อยคือการสร้างสตริงเดียวโดยรวมค่าจากหลายคอลัมน์เข้าด้วยกัน เช่น สร้างชื่อเต็มจากชื่อและนามสกุล หรือสร้างที่อยู่จากถนน เมือง และประเทศ ใน Pandas คุณสามารถต่อคอลัมน์สตริงโดยใช้ตัวดำเนินการ + กับ Series สองรายการ (หรือ Series กับสตริงตามตัวอักษร) หลังจากแปลงคอลัมน์ตัวเลขเป็นสตริงด้วย .astype(str)

import pandas as pd

df = pd.DataFrame({
    'first_name': ['Alice', 'Bob', 'Carol'],
    'last_name': ['Smith', 'Jones', 'White']
})

df['full_name'] = df['first_name'] + ' ' + df['last_name']
print(df['full_name'].tolist())
# ['Alice Smith', 'Bob Jones', 'Carol White']

การต่อกับคอลัมน์ที่ไม่ใช่สตริง

เมื่อรวมคอลัมน์ตัวเลขกับคอลัมน์สตริง คุณต้องแปลงคอลัมน์ตัวเลขเป็นสตริงก่อนโดยใช้ .astype(str) ตัวดำเนินการ + ของ Python จะทำให้เกิด TypeError หากคุณพยายามบวก Series สตริงกับ Series จำนวนเต็ม นี่เป็นสาเหตุทั่วไปของความสับสนเมื่อสร้างคีย์รวมหรือป้ายกำกับจากคอลัมน์ที่มีชนิดข้อมูลต่างกัน

import pandas as pd

df = pd.DataFrame({
    'product': ['Widget', 'Gadget'],
    'version': [3, 5]
})

# Must convert int to str before concatenating
df['label'] = df['product'] + ' v' + df['version'].astype(str)
print(df['label'].tolist())
# ['Widget v3', 'Gadget v5']

การใช้ .str.cat() เพื่อเชื่อมด้วยตัวคั่น

Series.str.cat(others, sep=) เป็นวิธีแบบเนทีฟของ Pandas สำหรับเชื่อม Series หลายรายการเข้าด้วยกันโดยใช้ตัวคั่น และจัดการค่า NaN ได้อย่างเหมาะสม โดยค่าเริ่มต้น หากมี NaN ในคอลัมน์ใดก็ตาม ผลลัพธ์ของแถวนั้นจะเป็น NaN ให้ส่ง na_rep='?' (หรือสตริงใดก็ได้) เพื่อแทนที่ NaN ด้วยตัวแทน แทนการส่งต่อค่า NaN ไปยังผลลัพธ์

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'city': ['NYC', 'LA', None],
    'state': ['NY', None, 'TX'],
    'country': ['USA', 'USA', 'USA']
})

# Join with ', ' — NaN rows produce NaN by default
df['location'] = df['city'].str.cat(
    [df['state'], df['country']],
    sep=', ',
    na_rep='N/A'
)
print(df['location'].tolist())
# ['NYC, NY, USA', 'LA, N/A, USA', 'N/A, TX, USA']

การทำให้ป้ายกำกับหมวดหมู่ที่ไม่สอดคล้องกันเป็นมาตรฐานเดียวกัน

คอลัมน์หมวดหมู่ในข้อมูลจริงมักมี ป้ายกำกับที่ไม่สอดคล้องกัน ซึ่งเกิดจากการพิมพ์ผิด ความแตกต่างของตัวพิมพ์ หรือคำย่อที่ต่างกัน (เช่น 'US', 'USA', 'United States') วิธีแก้มาตรฐานคือสร้างพจนานุกรมการจับคู่ที่จับคู่รูปแบบต่าง ๆ ทุกแบบเข้ากับรูปแบบมาตรฐาน จากนั้นนำไปใช้ด้วย .map() หรือ .replace()

import pandas as pd

df = pd.DataFrame({
    'country': ['US', 'USA', 'United States', 'uk', 'UK', 'United Kingdom']
})

canonical = {
    'US': 'United States', 'USA': 'United States', 'United States': 'United States',
    'uk': 'United Kingdom', 'UK': 'United Kingdom', 'United Kingdom': 'United Kingdom'
}

df['country_clean'] = df['country'].map(canonical)
print(df['country_clean'].tolist())
# ['United States', 'United States', 'United States',
#  'United Kingdom', 'United Kingdom', 'United Kingdom']

การตัดช่องว่างและทำตัวพิมพ์ให้เป็นมาตรฐาน

ก่อนเปรียบเทียบหรือจัดกลุ่มคอลัมน์ข้อความ ให้ ตัดช่องว่าง และ ทำตัวพิมพ์ให้เป็นมาตรฐาน เป็นขั้นตอนแรกของการทำความสะอาดเสมอ ค่าทั้งสองที่ดูเหมือนกันสำหรับมนุษย์ (' Active' และ 'active') จะถูก Pandas มองว่าแตกต่างกัน เนื่องจากมีช่องว่างนำหน้าและตัวพิมพ์ใหญ่ต่างกัน การเชื่อมคำสั่งสองขั้นตอน — ตัดช่องว่างแล้วจึงใช้ lower — จะตรวจจับปัญหาทั้งสองแบบได้

import pandas as pd

df = pd.DataFrame({
    'status': ['  Active', 'INACTIVE', 'active ', ' Pending  ', 'ACTIVE']
})

df['status_clean'] = df['status'].str.strip().str.lower()
print(df['status_clean'].value_counts())
# active      3
# inactive    1
# pending     1

การจับคู่แบบคลุมเครือเพื่อแก้คำที่พิมพ์ผิด

เมื่อการพิมพ์ผิดทำให้จับคู่แบบตรงกันไม่ได้ การจับคู่แบบคลุมเครือจะคำนวณคะแนนความคล้ายคลึงระหว่างสตริง ไลบรารี rapidfuzz (หรือ fuzzywuzzy รุ่นดั้งเดิม) มีฟังก์ชันสำหรับการจับคู่แบบคลุมเครือกับข้อมูลเวกเตอร์ ขั้นตอนทั่วไปคือ สำหรับค่าไม่สะอาดที่ไม่ซ้ำกันแต่ละค่า ให้ค้นหาค่ามาตรฐานที่ใกล้เคียงที่สุดและมีคะแนนสูงกว่าเกณฑ์ความคล้ายคลึง แล้วสร้างแผนที่การแก้ไข

# Conceptual example (requires: pip install rapidfuzz)
from rapidfuzz import process

canonical_cities = ['New York', 'Los Angeles', 'Chicago', 'Houston']
dirty_values = ['New Yrok', 'Los Angelas', 'Chicagoo']

for dirty in dirty_values:
    best, score, _ = process.extractOne(dirty, canonical_cities)
    print(f'{dirty!r} -> {best!r} (score={score:.0f}%)')
# 'New Yrok'   -> 'New York'    (score=91%)
# 'Los Angelas'-> 'Los Angeles' (score=96%)
# 'Chicagoo'   -> 'Chicago'     (score=94%)

การแยกเซลล์หลายค่าด้วย explode()

บางครั้งเซลล์หนึ่งมีหลายค่า โดยคั่นด้วยตัวคั่น (เช่น 'python,sql,pandas') ให้แยกคอลัมน์เพื่อให้ได้รายการ จากนั้นเรียกใช้ .explode() เพื่อสร้างหนึ่งแถวต่อหนึ่งค่า วิธีนี้จะแปลงเซลล์ที่กว้างและอัดรวมกันให้เป็นรูปแบบยาวที่เป็นระเบียบ โดยแต่ละแถวมีเพียงหนึ่งค่า ซึ่งจำเป็นสำหรับการดำเนินการ groupby และ join กับค่าเหล่านั้น

import pandas as pd

df = pd.DataFrame({
    'user_id': [1, 2, 3],
    'skills': ['python,sql', 'java,kotlin,sql', 'python']
})

df['skills'] = df['skills'].str.split(',')
exploded = df.explode('skills')
print(exploded)
#    user_id   skills
# 0        1   python
# 0        1      sql
# 1        2     java
# 1        2   kotlin
# 1        2      sql
# 2        3   python

การจัดการข้อความที่มีการเข้ารหัสผสมกัน

ข้อมูลข้อความจากแหล่งต่าง ๆ อาจมีปัญหาการเข้ารหัส เช่น อักขระแปลก ๆ อย่าง \xa0 (ช่องว่างไม่ตัดบรรทัด), \u2019 (อัญประกาศเดี่ยวแบบโค้ง) หรืออักขระที่มีเครื่องหมายกำกับเสียงซึ่งแสดงผลผิด ใช้ .str.encode('ascii', errors='replace').str.decode('ascii') เพื่อทำความสะอาดอย่างรวดเร็วโดยคงไว้เฉพาะ ASCII หรือใช้ .str.normalize('NFKD') เพื่อแยกเครื่องหมายกำกับเสียงออกก่อนตัดทิ้ง

import pandas as pd
import unicodedata

df = pd.DataFrame({'name': ['Caf\u00e9', 'na\u00efve', 'r\u00e9sum\u00e9']})

# Normalize and strip accents (NFKD decomposition + ascii encoding)
df['name_ascii'] = (
    df['name']
    .str.normalize('NFKD')
    .str.encode('ascii', errors='ignore')
    .str.decode('ascii')
)
print(df)
#       name name_ascii
# 0     Cafe       Cafe
# 1    naive      naive
# 2   resume     resume

การสร้างคีย์ประกอบ

ในชุดข้อมูลจำนวนมาก คุณจำเป็นต้องสร้างคีย์ประกอบจากหลายคอลัมน์ เพื่อระบุแถวหนึ่งแถวอย่างไม่ซ้ำกันสำหรับการเชื่อมข้อมูลหรือการลบข้อมูลซ้ำ การรวมคอลัมน์สตริงที่ทำความสะอาดแล้ว (ตัดช่องว่าง เปลี่ยนเป็นตัวพิมพ์เล็ก และทำให้เป็นมาตรฐาน) เป็นสตริงคีย์เดียว ช่วยให้จับคู่ข้อมูลจากแหล่งต่าง ๆ ได้สอดคล้องกัน แม้ชื่อของเอนทิตีเดียวกันจะสะกดต่างกันเล็กน้อยในแต่ละแหล่ง

import pandas as pd

df = pd.DataFrame({
    'first': ['  Alice', 'BOB', ' Carol'],
    'last': ['Smith ', 'JONES', 'White  '],
    'dob': ['1990-01-15', '1985-07-22', '1992-11-30']
})

df['match_key'] = (
    df['first'].str.strip().str.lower() + '|' +
    df['last'].str.strip().str.lower() + '|' +
    df['dob']
)
print(df['match_key'].tolist())
# ['alice|smith|1990-01-15', 'bob|jones|1985-07-22', 'carol|white|1992-11-30']

การบังคับใช้รายการหมวดหมู่มาตรฐาน

หลังจากทำความสะอาดแล้ว ให้ตรวจสอบว่าค่าทั้งหมดในคอลัมน์ข้อความแบบหมวดหมู่เป็นสมาชิกของชุดมาตรฐานที่รู้จัก ค่าที่ไม่อยู่ในชุดอาจบ่งชี้ว่าเป็นหมวดหมู่ใหม่ที่ถูกต้อง หรือเป็นข้อผิดพลาดของข้อมูล ให้บันทึกหรือทำเครื่องหมายค่าที่ไม่รู้จักไว้ตรวจสอบด้วยตนเอง แทนการลบทิ้งโดยไม่แจ้ง เพื่อไม่ให้มีสิ่งใดหลุดรอดไปโดยไม่ถูกสังเกต

import pandas as pd

df = pd.DataFrame({
    'status': ['active', 'inactive', 'active', 'archived', 'unknown_status']
})

canonical = {'active', 'inactive', 'archived'}

unknown = df[~df['status'].isin(canonical)]['status'].unique()
print('Unknown statuses:', unknown.tolist())
# ['unknown_status']

# Flag unknown rows
df['status_valid'] = df['status'].isin(canonical)
print(df)

กระบวนการทำความสะอาดข้อความแบบครบวงจร

ต่อไปนี้คือกระบวนการทำความสะอาดข้อความแบบครบวงจร ซึ่งใช้เทคนิคทั้งหมดจากบทเรียนนี้ ได้แก่ ตัดช่องว่าง ทำตัวพิมพ์ให้เป็นมาตรฐาน แก้คำย่อ ลบอักขระพิเศษ และตรวจสอบกับรายการมาตรฐาน นี่คือลักษณะของฟังก์ชันที่นำกลับมาใช้ซ้ำได้ ซึ่งคุณสามารถเพิ่มลงในมอดูลนำเข้าข้อมูลใด ๆ ได้

import pandas as pd

def clean_category_column(series, canonical_map, canonical_set):
    cleaned = (
        series
        .str.strip()
        .str.lower()
        .map(lambda x: canonical_map.get(x, x))  # fix known variants
    )
    unknown = cleaned[~cleaned.isin(canonical_set)]
    if not unknown.empty:
        print('Warning: unknown values:', unknown.unique().tolist())
    return cleaned

cmap = {'eng': 'engineering', 'hr': 'human_resources', 'mktg': 'marketing'}
cset = {'engineering', 'human_resources', 'marketing', 'finance'}

df = pd.DataFrame({'dept': ['Eng', 'HR', 'Marketing', 'MKTG', 'Legal']})
df['dept_clean'] = clean_category_column(df['dept'], cmap, cset)
print(df)

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจเกี่ยวกับการรวมและทำความสะอาดคอลัมน์ข้อความ

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้วิธีต่อคอลัมน์ด้วยตัวดำเนินการ + หลังแปลงค่าตัวเลขเป็นสตริง ใช้ str.cat(sep=) เพื่อเชื่อมด้วยตัวคั่นและจัดการ NaN ใช้แผนที่มาตรฐานด้วย .map() เพื่อทำให้ป้ายกำกับที่ไม่สอดคล้องกันเป็นมาตรฐาน และใช้ explode() เพื่อขยายเซลล์ที่มีค่าเป็นรายการให้เป็นแถว บังคับใช้ชุดมาตรฐานเพื่อค้นหาปัญหาคุณภาพข้อมูลตั้งแต่เนิ่น ๆ บทถัดไป เราจะเรียงลำดับ DataFrames ตามค่าคอลัมน์

เริ่มต้นได้ฟรี

เรียนรู้ Python ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
30
บทเรียน
120

คำถามที่พบบ่อย

บทเรียน “การรวมและทำความสะอาดคอลัมน์ข้อความ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การรวมและทำความสะอาดคอลัมน์ข้อความ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การรวมและทำความสะอาดคอลัมน์ข้อความ”

ต่อหลายคอลัมน์เป็นสตริงเดียว ลบช่องว่างส่วนเกิน และปรับป้ายกำกับหมวดหมู่ที่ไม่สอดคล้องกันให้เป็นมาตรฐาน คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การรวมและทำความสะอาดคอลัมน์ข้อความ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม

ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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