การตรวจหาและลบข้อมูลซ้ำ
ค้นหาข้อมูลซ้ำทั้งแบบตรงกันทั้งหมดและบางส่วนด้วย duplicated() และ drop_duplicates() แล้วตัดสินใจว่าจะเก็บระเบียนซ้ำรายการใด
การตรวจหาและลบข้อมูลซ้ำ เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดข้อมูลซ้ำจึงสำคัญ
แถวที่ซ้ำกันทำให้จำนวน ยอดรวมรายได้ และค่าเฉลี่ยเพิ่มขึ้นอย่างเงียบ ๆ โดยไม่มีข้อความผิดพลาด ชุดข้อมูลการขายที่มีระเบียนคำสั่งซื้อซ้ำ 500 รายการจะทำให้รายได้สูงเกินจริงเป็นจำนวนเท่ากับผลรวมของคำสั่งซื้อทั้ง 500 รายการนั้น การตรวจหาและลบข้อมูลซ้ำเป็นหนึ่งในขั้นตอนแรก ๆ ของการทำความสะอาดข้อมูลที่ควรทำ ก่อนการรวมข้อมูลหรือการสร้างแบบจำลองใด ๆ เพราะข้อผิดพลาดในขั้นตอนถัดไปจะสะสมต่อเนื่องจากแหล่งข้อมูลที่เสียหายเพียงจุดเดียวนี้
import pandas as pd
df = pd.read_csv('orders.csv')
print('Shape before dedup:', df.shape)
print('Exact duplicates:', df.duplicated().sum())ค้นหาข้อมูลซ้ำที่เหมือนกันทุกประการ
df.duplicated() จะคืนค่า Series แบบบูลีน ซึ่งมีค่าเป็น True สำหรับทุกแถวที่เป็นสำเนาที่เหมือนกับแถวก่อนหน้าโดยสมบูรณ์ ค่าเริ่มต้น keep='first' จะทำเครื่องหมายทุกแถวยกเว้นรายการแรก การส่งค่า keep=False จะทำเครื่องหมายข้อมูลซ้ำทุกรายการ ซึ่งมีประโยชน์เมื่อต้องการตรวจสอบสำเนาทั้งหมดของระเบียนซ้ำก่อนตัดสินใจว่าจะเก็บรายการใดไว้
# Mark only the second+ occurrences
partial_dups = df[df.duplicated(keep='first')]
print('Rows to remove:', len(partial_dups))
# Mark ALL copies of any duplicate
all_dups = df[df.duplicated(keep=False)]
print('Rows involved in duplicates:', len(all_dups))ลบข้อมูลซ้ำที่เหมือนกันทุกประการ
ลบแถวที่ซ้ำกันทุกประการด้วย df.drop_duplicates() โดยค่าเริ่มต้น ระบบจะเก็บรายการแรกไว้และลบรายการอื่นทั้งหมด ส่งค่า keep='last' เพื่อเก็บระเบียนล่าสุด หากข้อมูลมีการประทับเวลาและถือว่าแถวหลังมีความน่าเชื่อถือมากกว่า ควรตรวจสอบจำนวนแถวก่อนและหลังการลบเสมอ เพื่อยืนยันว่าจำนวนแถวที่ถูกลบเป็นไปตามที่คาดไว้
df_clean = df.drop_duplicates(keep='first')
print('Rows removed:', len(df) - len(df_clean))
print('Shape after dedup:', df_clean.shape)ข้อมูลซ้ำบางส่วน: ใช้คีย์เป็นเกณฑ์
แถวข้อมูลอาจเป็นข้อมูลซ้ำบางส่วน กล่าวคือมีคีย์ทางธุรกิจเดียวกัน (เช่น order_id) แต่ค่าคอลัมน์อื่นแตกต่างกัน เนื่องจากข้อผิดพลาดในระบบต้นทางที่สร้างระเบียนเดียวกันขึ้นมาสองเวอร์ชัน ใช้ df.duplicated(subset=['order_id']) เพื่อค้นหาแถวที่มีคีย์เดียวกันแต่ค่าในคอลัมน์อื่นอาจแตกต่างกัน ตรวจสอบแถวเหล่านี้ก่อนตัดสินใจว่าจะจัดการให้สอดคล้องกันอย่างไร
key_dups = df[df.duplicated(subset=['order_id'], keep=False)]
print('Orders with duplicate IDs:')
print(key_dups.sort_values('order_id').head(10))เลือกว่าจะเก็บข้อมูลซ้ำรายการใด
เมื่อมีข้อมูลซ้ำบางส่วน คุณต้องตัดสินใจว่าระเบียนใดเป็นข้อมูลหลัก กลยุทธ์ที่ใช้กันทั่วไป ได้แก่ เก็บแถวที่มีเวลาอัปเดตล่าสุด เก็บแถวที่มีค่าที่ไม่ใช่ค่าว่างมากที่สุด หรือเก็บแถวที่มีจำนวนเงินสูงกว่า หากระเบียนหนึ่งมีการแก้ไขข้อมูล ให้เรียงลำดับตามเกณฑ์ตัดสินกรณีเสมอกัน แล้วลบข้อมูลซ้ำโดยเก็บรายการที่พบเป็นรายการแรก (หรือรายการสุดท้าย)
# Keep the record with the latest update timestamp
df_sorted = df.sort_values('updated_at', ascending=False)
df_dedup = df_sorted.drop_duplicates(subset=['order_id'], keep='first')
print('Kept:', len(df_dedup), 'unique orders')การตรวจหาข้อมูลที่เกือบซ้ำกัน
ข้อมูลที่เกือบซ้ำกันคือแถวที่แทนเอนทิตีเดียวกันแต่แตกต่างกันเล็กน้อย เช่น ชื่อลูกค้าคนเดียวกันที่มีการพิมพ์ผิด หรือธุรกรรมเดียวกันที่มีผลต่างจากการปัดเศษ 1 เซนต์ การตรวจหาข้อมูลซ้ำแบบตรงกันทุกประการจะตรวจไม่พบกรณีเหล่านี้ วิธีหนึ่งคือจัดกลุ่มตามคอลัมน์คีย์แล้วนับจำนวน หากชื่อลูกค้าปรากฏในรูปแบบที่แตกต่างกันเล็กน้อย ให้ใช้ .str.strip().str.lower() เพื่อทำให้ข้อมูลเป็นรูปแบบมาตรฐานก่อนลบข้อมูลซ้ำ
df['customer_normalized'] = df['customer_name'].str.strip().str.lower()
near_dups = df.groupby('customer_normalized').size().sort_values(ascending=False)
print(near_dups[near_dups > 1].head())การลบข้อมูลซ้ำด้วยการรวมกลุ่มและการรวมค่า
เมื่อต้องการผสานแถวที่ซ้ำกันแทนที่จะลบทิ้งเพียงอย่างเดียว ให้ใช้ groupby().agg() ตัวอย่างเช่น หากสองแถวแทนคำสั่งซื้อเดียวกัน แต่แถวหนึ่งมีที่อยู่สำหรับจัดส่งและอีกแถวมีที่อยู่สำหรับเรียกเก็บเงิน คุณสามารถรวมค่าด้วย 'first' (โดยเลือกค่าที่ไม่ใช่ค่าว่างก่อน) หรือใช้ฟังก์ชันแบบกำหนดเองที่รวมค่าที่ไม่ใช่ค่าว่างจากข้อมูลซ้ำเข้าด้วยกัน
def coalesce(*args):
for a in args:
if pd.notna(a):
return a
return None
df_merged = df.groupby('order_id').agg(
customer=('customer_name', 'first'),
amount=('amount', 'max'),
date=('order_date', 'min')
).reset_index()
print(df_merged.head())การตรวจสอบความไวต่อการเรียงลำดับแถว
ผลลัพธ์ของ drop_duplicates(keep='first') ขึ้นอยู่กับลำดับของแถว หากโหลด DataFrame จากคำสั่งค้นฐานข้อมูลที่ไม่มีส่วนคำสั่ง ORDER BY ลำดับแถวจะไม่แน่นอน ซึ่งหมายความว่าระเบียนที่เก็บไว้อาจแตกต่างกันในแต่ละครั้งที่เรียกใช้ ให้เรียงลำดับตามคีย์ที่มีเสถียรภาพเสมอ (เช่น คีย์หลักหรือเวลา) ก่อนลบข้อมูลซ้ำ เพื่อให้กระบวนการมีผลลัพธ์แน่นอนและทำซ้ำได้
# Sort by primary key before deduplication for deterministic results
df = df.sort_values('order_id').reset_index(drop=True)
df_clean = df.drop_duplicates(subset=['order_id'], keep='first')
print('Deterministic dedup complete.')การตรวจสอบผลลัพธ์หลังลบข้อมูลซ้ำ
หลังจากลบข้อมูลซ้ำแล้ว ให้ตรวจสอบผลลัพธ์ด้วยการตรวจสอบสามประการ ได้แก่ ไม่มีข้อมูลซ้ำที่ตรงกันทุกประการเหลืออยู่ (df_clean.duplicated().sum() == 0) ไม่มีคีย์ทางธุรกิจซ้ำ (df_clean.duplicated(subset=['order_id']).sum() == 0) และจำนวนแถวที่คาดไว้มีความสมเหตุสมผล ให้เขียนการตรวจสอบเหล่านี้เป็นข้อยืนยัน เพื่อให้โปรแกรมหยุดพร้อมรายงานข้อผิดพลาดอย่างชัดเจน หากข้อมูลในอนาคตทำให้ตรรกะการทำความสะอาดใช้ไม่ได้
assert df_clean.duplicated().sum() == 0, 'Exact duplicates remain'
assert df_clean.duplicated(subset=['order_id']).sum() == 0, 'Duplicate order IDs remain'
print('Deduplication verified. Rows:', len(df_clean))การบันทึกข้อมูลซ้ำที่ถูกนำออก
การทำความสะอาดข้อมูลที่ดีต้องทำซ้ำได้และตรวจสอบย้อนหลังได้ ให้บันทึกจำนวนแถวที่นำออก คีย์ที่ใช้ลบข้อมูลซ้ำ และกฎตัดสินกรณีเสมอกันลงในพจนานุกรมรายงานการทำความสะอาด บันทึกรายงานนี้ไว้พร้อมกับไฟล์ข้อมูลที่สะอาด เพื่อให้ผู้ที่เรียกใช้กระบวนการในภายหลังตรวจสอบการตัดสินใจทำความสะอาดได้โดยไม่ต้องอ่านโค้ดใหม่ทั้งหมด ความโปร่งใสในการทำความสะอาดข้อมูลช่วยสร้างความน่าเชื่อถือให้ผลการวิเคราะห์
cleaning_log = {
'original_rows': len(df),
'dedup_key': 'order_id',
'tiebreak': 'keep first by updated_at desc',
'rows_removed': len(df) - len(df_clean),
'clean_rows': len(df_clean)
}
for k, v in cleaning_log.items():
print(f'{k}: {v}')การบันทึกชุดข้อมูลหลังลบข้อมูลซ้ำ
บันทึก DataFrame ที่ลบข้อมูลซ้ำแล้วลงในไฟล์ใหม่ แทนการเขียนทับไฟล์ต้นฉบับ วิธีนี้ช่วยเก็บข้อมูลดิบไว้สำหรับการตรวจสอบย้อนหลัง ตั้งชื่อไฟล์ให้ชัดเจนโดยเติมท้ายด้วย _clean หรือ _deduped และใส่วันที่เรียกใช้ เพื่อให้แยกการทำความสะอาดแต่ละครั้งได้ ใช้ Parquet เพื่อให้โหลดข้อมูลกลับมาได้รวดเร็วในขั้นตอนถัดไปของกระบวนการ
from datetime import date
output_path = f'orders_clean_{date.today()}.parquet'
df_clean.to_parquet(output_path, index=False)
print(f'Saved {len(df_clean)} rows to {output_path}')ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจแนวคิดด้านการวิเคราะห์ข้อมูลจากบทเรียนนี้
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้เกี่ยวกับ การตรวจหาข้อมูลซ้ำแบบตรงกันทุกประการและข้อมูลซ้ำบางส่วนด้วย duplicated() และ drop_duplicates() การเลือกข้อมูลซ้ำที่จะเก็บโดยใช้กลยุทธ์การเรียงลำดับและการรวมค่า และ การตรวจสอบผลลัพธ์ด้วยข้อยืนยันพร้อมบันทึกการตัดสินใจทำความสะอาด บทถัดไปเราจะศึกษาเทคนิคการตรวจหาและจัดการค่าผิดปกติ
เรียนรู้ Python ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 30
- บทเรียน
- 120
คำถามที่พบบ่อย
บทเรียน “การตรวจหาและลบข้อมูลซ้ำ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การตรวจหาและลบข้อมูลซ้ำ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การตรวจหาและลบข้อมูลซ้ำ”
ค้นหาข้อมูลซ้ำทั้งแบบตรงกันทั้งหมดและบางส่วนด้วย duplicated() และ drop_duplicates() แล้วตัดสินใจว่าจะเก็บระเบียนซ้ำรายการใด คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การตรวจหาและลบข้อมูลซ้ำ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม
ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การตรวจหาและลบข้อมูลซ้ำ
- การตรวจหาและจัดการค่าผิดปกติ
- การทำหมวดหมู่ที่ไม่สอดคล้องให้เป็นมาตรฐาน
- การตรวจสอบโครงสร้างข้อมูลและการยืนยันเงื่อนไข