Skip to content

Lab: Clean Messy Data

ในแล็บนี้คุณจะได้ข้อมูลที่ “เละ” สุดๆ และต้อง clean ให้พร้อมวิเคราะห์ นี่คือสถานการณ์ที่พบได้จริงในทุกวัน

  1. สร้างข้อมูลเละๆ

    import pandas as pd
    messy = pd.DataFrame({
    "name": [" Alice ", " BOB", "charlie ", None, " Diana "],
    "city": ["กทม.", "กทม", "กรุงเทพ", "เชียงใหม่ ", "กรุงเทพฯ"],
    "zipcode": ["10100", "1020", "10300", "50000", "104"],
    "salary": ["50000", "N/A", "45000", "62000", "ไม่ระบุ"],
    "active": ["yes", "YES", "no", "Yes", None]
    })
  2. Clean ชื่อ — strip whitespace, title case, fill missing

  3. Normalize เมือง — รวม “กทม.”, “กทม”, “กรุงเทพ”, “กรุงเทพฯ” เป็นค่าเดียว

  4. ซ่อม zipcode — เติม 0 ให้ครบ 5 หลัก

  5. แปลง salary — เป็น numeric, ค่าที่แปลงไม่ได้ → NaN

  6. Normalize active — แปลง yes/YES/Yes → True, no → False, None → False

  7. ตรวจสอบผลลัพธ์ — ใช้ .info() และ .isna().sum() ยืนยันว่า clean แล้ว

Show Solution
import pandas as pd
# Step 2: Clean ชื่อ
messy["name"] = messy["name"].str.strip().str.title()
messy["name"] = messy["name"].fillna("Unknown")
# Step 3: Normalize เมือง
messy["city"] = messy["city"].str.strip()
messy["city"] = messy["city"].str.replace(
r"กทม\.?|กรุงเทพฯ?", "กรุงเทพมหานคร", regex=True
)
# Step 4: ซ่อม zipcode
messy["zipcode"] = messy["zipcode"].str.zfill(5)
# Step 5: แปลง salary
messy["salary"] = pd.to_numeric(messy["salary"], errors="coerce")
# Step 6: Normalize active
messy["active"] = (
messy["active"]
.str.lower()
.map({"yes": True, "no": False})
.fillna(False)
)
# Step 7: ตรวจสอบ
print(messy)
print(messy.dtypes)
print(messy.isna().sum())
messy.info()