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