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

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

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

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

ปัญหาของหมวดหมู่ที่ไม่สอดคล้องกัน

เมื่อมนุษย์เป็นผู้ป้อนข้อมูลหมวดหมู่ แนวคิดเดียวกันอาจปรากฏด้วยการสะกดหลายรูปแบบ: Electronics, electronics, ELECTRONICS, Electronicss การใช้ groupby กับคอลัมน์นี้จะสร้างกลุ่มเล็ก ๆ จำนวนมากแทนที่จะเป็นกลุ่มเดียวที่มีความหมาย การทำให้หมวดหมู่เป็นมาตรฐานตามรายการรูปแบบหลักเป็นหนึ่งในขั้นตอนการทำความสะอาดที่สำคัญที่สุดก่อนการรวมค่าหรือสร้างคุณลักษณะสำหรับการเรียนรู้ของเครื่อง

import pandas as pd

df = pd.read_csv('products.csv')
print(df['category'].value_counts().head(20))

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

ขั้นตอนแรกและง่ายที่สุดของการทำให้เป็นมาตรฐาน คือการจัดการตัวพิมพ์และช่องว่างให้เป็นรูปแบบเดียวกัน ใช้ .str.strip().str.lower() เพื่อลบช่องว่างด้านหน้าและด้านหลัง และเปลี่ยนทุกค่าเป็นตัวพิมพ์เล็กก่อนการเปรียบเทียบอื่น ๆ ขั้นตอนเดียวนี้จะรวมรูปแบบต่าง ๆ เข้าด้วยกัน เช่น Electronics, electronics และ ' Electronics ' จะกลายเป็น electronics ทั้งหมดหลังทำให้เป็นมาตรฐาน

df['category_clean'] = df['category'].str.strip().str.lower()

print('Before:', df['category'].nunique())
print('After:', df['category_clean'].nunique())

การจับคู่ชื่อเรียกอื่นด้วยพจนานุกรม

หลังจากทำให้ตัวพิมพ์เป็นมาตรฐานแล้ว รูปแบบหลายแบบยังคงแตกต่างกันเนื่องจากคำย่อ คำพ้องความหมาย หรือชื่อแบบเก่า สร้างพจนานุกรมจับคู่ชื่อเรียกอื่น โดยให้คีย์เป็นรูปแบบการสะกดต่าง ๆ และค่าเป็นรูปแบบมาตรฐาน ใช้พจนานุกรมนี้ด้วย df['category_clean'].map(alias_map).fillna(df['category_clean']) — fillna จะเก็บค่าที่ไม่มีอยู่ในพจนานุกรมไว้ แทนที่จะแทนค่าด้วย NaN

alias_map = {
    'elect': 'electronics',
    'elec': 'electronics',
    'tech': 'electronics',
    'clothing': 'apparel',
    'clothes': 'apparel',
    'garments': 'apparel'
}

df['category_clean'] = df['category_clean'].map(alias_map).fillna(df['category_clean'])
print(df['category_clean'].value_counts().head())

การใช้ str.replace เพื่อแก้รูปแบบ

ชื่อหมวดหมู่บางชื่อมีข้อผิดพลาดด้านรูปแบบที่เกิดซ้ำ เช่น ช่องว่างสองช่องติดกันหรือตัวเลขต่อท้าย ใช้ .str.replace() พร้อมนิพจน์ทั่วไปเพื่อแก้รูปแบบเหล่านี้ในทุกแถวพร้อมกัน ตัวอย่างเช่น .str.replace(r'\s+', ' ', regex=True) จะรวมช่องว่างหลายช่องให้เหลือหนึ่งช่อง และ .str.replace(r'\d+$', '', regex=True) จะลบตัวเลขที่อยู่ท้ายชื่อหมวดหมู่

df['category_clean'] = (
    df['category_clean']
    .str.replace(r'\s+', ' ', regex=True)  # collapse spaces
    .str.replace(r'\d+$', '', regex=True)   # strip trailing numbers
    .str.strip()
)

print(df['category_clean'].value_counts())

การจับคู่แบบคลุมเครือด้วย difflib

เมื่อการพิมพ์ผิดคาดเดาไม่ได้ ให้ใช้การจับคู่แบบคลุมเครือเพื่อค้นหาหมวดหมู่รูปแบบหลักที่ใกล้เคียงที่สุดสำหรับแต่ละรูปแบบ Python มี difflib.get_close_matches() ในตัว ซึ่งคืนค่ารายการที่ตรงกันมากที่สุดจากรายการหมวดหมู่ที่ถูกต้อง โดยพิจารณาจากความคล้ายคลึงของข้อความ ใช้ฟังก์ชันนี้เป็นฟังก์ชันช่วยผ่าน df['category'].apply() เพื่อจัดการรูปแบบต่าง ๆ ที่ map() เพียงอย่างเดียวตรวจไม่พบ

from difflib import get_close_matches

CANONICAL = ['electronics', 'apparel', 'home', 'sports', 'beauty']

def fuzzy_fix(val):
    matches = get_close_matches(str(val).lower().strip(), CANONICAL, n=1, cutoff=0.7)
    return matches[0] if matches else val

df['category_fuzzy'] = df['category_clean'].apply(fuzzy_fix)
print(df[['category_clean', 'category_fuzzy']].head(10))

การสร้างรายการหมวดหมู่รูปแบบหลัก

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

CANONICAL_CATEGORIES = {
    'electronics', 'apparel', 'home', 'sports',
    'beauty', 'food', 'toys', 'automotive'
}

df['is_known_category'] = df['category_fuzzy'].isin(CANONICAL_CATEGORIES)
unknown = df[~df['is_known_category']]['category_fuzzy'].unique()
print('Unknown categories remaining:', unknown)

การจัดการหมวดหมู่ที่ไม่รู้จัก

หมวดหมู่ที่ไม่รู้จักและไม่ตรงกับค่ารูปแบบหลักใด ๆ หลังการแก้ไขแบบคลุมเครือ ควรรวมไว้ภายใต้ป้ายกำกับ Other แทนการลบทิ้ง เพื่อไม่ให้ข้อมูลบางแถวสูญหายโดยไม่รู้ตัว กำหนดค่าเหล่านั้นเป็น 'other' ด้วย np.where() หรือการกำหนดค่าแบบมีเงื่อนไขอย่างง่าย บันทึกจำนวนแถวที่ถูกจับคู่เป็น 'other' และตรวจสอบว่ามีรูปแบบใดที่อาจเหมาะสมกับการเพิ่มหมวดหมู่รูปแบบหลักใหม่หรือไม่

import numpy as np

df['category_final'] = np.where(
    df['category_fuzzy'].isin(CANONICAL_CATEGORIES),
    df['category_fuzzy'],
    'other'
)

print(df['category_final'].value_counts())

การกำหนดชนิดข้อมูล Categorical

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

df['category_final'] = pd.Categorical(
    df['category_final'],
    categories=list(CANONICAL_CATEGORIES) + ['other']
)

print(df['category_final'].dtype)
print(df['category_final'].cat.categories)

การตรวจสอบคอลัมน์ที่สะอาดแล้ว

หลังจากดำเนินการปรับให้เป็นมาตรฐานทั้งหมดแล้ว ให้ตรวจสอบขั้นสุดท้าย โดยยืนยันว่าไม่มีค่าใดนอกเหนือจากชุดค่ามาตรฐานปรากฏในคอลัมน์ที่ทำความสะอาดแล้ว ให้ใช้ assert df['category_final'].isin(valid_set).all() วางการยืนยันนี้ไว้ท้ายฟังก์ชันทำความสะอาด เพื่อให้ทำงานทุกครั้งที่ pipeline ทำงาน และตรวจจับการถดถอยเมื่อข้อมูลดิบชุดใหม่มีป้ายกำกับหมวดหมู่ที่ไม่เคยพบมาก่อน

valid_set = set(CANONICAL_CATEGORIES) | {'other'}

assert df['category_final'].isin(valid_set).all(), 'Invalid category found'
print('All categories valid. Distribution:')
print(df['category_final'].value_counts())

การติดตามการเปลี่ยนแปลงจากการปรับให้เป็นมาตรฐาน

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

changed = df['category'] != df['category_final']
diff_table = df[changed][['category', 'category_final']].drop_duplicates()
diff_table.columns = ['original', 'mapped_to']
print(f'Unique mappings applied: {len(diff_table)}')
print(diff_table)

การบันทึกชุดข้อมูลที่ปรับให้เป็นมาตรฐานแล้ว

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

df_out = df.drop(columns=['category_clean', 'category_fuzzy', 'is_known_category'])
df_out = df_out.rename(columns={'category_final': 'category'})

df_out.to_parquet('products_clean.parquet', index=False)
print('Saved. Category distribution:')
print(df_out['category'].value_counts())

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

ทดสอบความเข้าใจแนวคิดการวิเคราะห์ข้อมูลจากบทเรียนนี้

สรุปบทเรียน

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

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

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

ใช่ — ข้อความเต็มของ “การทำหมวดหมู่ที่ไม่สอดคล้องให้เป็นมาตรฐาน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ 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 ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

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

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

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

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

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

  1. การตรวจหาและลบข้อมูลซ้ำ
  2. การตรวจหาและจัดการค่าผิดปกติ
  3. การทำหมวดหมู่ที่ไม่สอดคล้องให้เป็นมาตรฐาน
  4. การตรวจสอบโครงสร้างข้อมูลและการยืนยันเงื่อนไข
← กลับไปที่ Pandas & NumPy Academy