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