DataFrame
คืน DataFrame ใหม่ที่ลบแถวซ้ำออกแล้วครับ ต่อ method อื่นได้เลยเช่น .reset_index(drop=True) ถ้าอยากให้ index เรียงใหม่ตั้งแต่ 0
| อาร์กิวเมนต์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
| [subset]ไม่บังคับ | str | list | None | None | ชื่อคอลัมน์ที่ใช้ตรวจสอบความซ้ำ ถ้าไม่ระบุจะดูทุกคอลัมน์ เช่น ’email’ หรือ [‘first_name’, ‘last_name’] |
| [keep]ไม่บังคับ | str | 'first' | แถวไหนที่จะเก็บไว้เมื่อพบซ้ำ: ‘first’ เก็บแถวแรก, ‘last’ เก็บแถวสุดท้าย, False ลบซ้ำทั้งหมดทิ้ง |
[ ] = อาร์กิวเมนต์ที่ไม่บังคับ
ปัญหาข้อมูลซ้ำนี่ผมเจอแทบทุกโปรเจกต์เลยครับ 😎 ไม่ว่าจะเป็นข้อมูลที่ join มาจากหลายตาราง หรือ import มาจากหลาย file รวมกัน มักจะมีแถวซ้ำแฝงอยู่เสมอ
drop_duplicates ทำงานง่ายมากครับ มันสแกนทุกแถวและเปรียบเทียบค่าในคอลัมน์ที่เราระบุ ถ้าพบว่าซ้ำกัน ก็จะเอาออก เหลือไว้แค่แถวเดียว โดย default จะเก็บแถวแรกที่เจอ (keep=’first’) และดูทุกคอลัมน์ในการเปรียบเทียบ
ที่เจ๋งคือ parameter subset ครับ — ผมใช้บ่อยมากตอนอยากดูซ้ำแค่บางคอลัมน์ เช่น ถ้ามีข้อมูลลูกค้าที่ customer_id ซ้ำกัน แต่ email ต่างกัน ก็ใช้ subset=[‘customer_id’] เพื่อดึงแถวเฉพาะ customer_id ที่ไม่ซ้ำออกมาได้เลย ไม่ต้องสนใจว่าคอลัมน์อื่นต่างกันหรือเปล่า
ส่วนตัวผมชอบตัวนี้มากกว่า Excel Remove Duplicates ตรงที่มัน return DataFrame ใหม่ให้เลย ข้อมูลเดิมไม่หาย ทำให้ pipeline ยาวๆ ไม่มีผลข้างเคียงครับ
ผมมีข้อมูลพนักงาน 4 แถว แต่แถวที่ 1 กับแถว 3 ซ้ำกันทุกคอลัมน์ (สมชาย-IT-50000) drop_duplicates() จะลบแถว 3 ออก เหลือ 3 แถวที่ไม่ซ้ำกันครับ ง่ายมากเลย
อันนี้คือ use case ที่ผมใช้บ่อยที่สุดครับ ลูกค้า ID=1 มีอยู่ 2 แถว แต่ข้อมูลต่างกัน (อาจเป็นการ update ชื่อและ email) subset=['customer_id'] บอกให้ดูซ้ำแค่คอลัมน์ customer_id เท่านั้น ผลคือเก็บแถวแรกของ ID=1 ไว้ แถวที่ 3 จะถูกลบออก แม้ว่า name กับ email ต่างกันก็ตาม
คราวนี้ผมเปลี่ยนเป็น keep='last' ครับ ซึ่งหมายความว่าถ้า customer_id ซ้ำกัน จะเก็บแถวหลังสุดไว้ นั่นคือข้อมูลล่าสุดของลูกค้า ID=1 คือ 'Alice Updated' ที่อัปเดตวันที่ 2024-03-15 เหมาะมากตอนอยากได้ข้อมูลล่าสุดของแต่ละ record ครับ
ผมมี order_id 6 แถว มีซ้ำกัน 2 คู่ (101 กับ 102) หลัง drop_duplicates() จะเหลือ 4 แถว ถ้าอยากรู้ว่าลบไปกี่แถว ใช้ len(df) – len(df.drop_duplicates()) ก็ได้ครับ สะดวกดีตอน QA ข้อมูล
คืน DataFrame ใหม่เสมอครับ DataFrame เดิมไม่เปลี่ยน ถ้าอยากให้ตัวแปรเดิมอัปเดต ต้องรับกลับเองเช่น df = df.drop_duplicates() ผมชอบแบบนี้มากกว่า inplace=True เพราะ debug ง่ายกว่า ย้อนดูข้อมูลเดิมได้ตลอดครับ
คล้ายกันมากครับ แต่ pandas ยืดหยุ่นกว่าใน 2 เรื่องหลัก คือ (1) เลือกได้ว่าจะเก็บแถวแรกหรือแถวสุดท้ายด้วย keep — Excel เก็บแถวแรกเสมอ และ (2) ไม่แก้ไขข้อมูลเดิม ได้ DataFrame ใหม่กลับมา ทำให้ใช้ใน data pipeline ได้โดยไม่กลัวข้อมูลต้นฉบับเสียหายครับ
ใช้ keep=False ครับ เช่น df.drop_duplicates(subset=['customer_id'], keep=False) จะลบทุกแถวที่มี customer_id ซ้ำออกหมดเลย ไม่เหลือแม้แต่แถวแรก ผมใช้ตอนอยากเอาเฉพาะ record ที่ไม่มีการซ้ำกันเลย เช่น งาน deduplication ที่ strict มากๆ
ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas drop_duplicates จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
nunique ใน pandas ผมใช้นับว่าในแต่ละคอลัมน์มีค่าที่ไม่ซ้ำกันกี่ตัว เหมือนกับการ Remove Duplicates ใน Excel แล้วนับจำนวนที่เหลือ หรือนับ unique ด้วย COUNTA นั่นแหละครับ เหมาะมากตอนอยากรู้ว่าข้อมูลมีกี่ลูกค้า กี่จังหวัด หรือกี่ประเภท
Series.value_counts() ใน pandas ผมใช้สำหรับนับว่าแต่ละค่าใน column ปรากฏกี่ครั้ง ได้ผลเรียงจากมากไปน้อยอัตโนมัติ ใช้ดูการกระจายของข้อมูลหรือหาค่าที่พบบ่อยสุดได้เร็วมากครับ
drop ใน pandas ผมใช้สำหรับตัดคอลัมน์หรือแถวที่ไม่ต้องการออกจาก DataFrame โดยระบุชื่อเองโดยตรง เหมือนการ "ลบคอลัมน์" ใน Excel แบบเลือกได้เป๊ะๆ ว่าจะเอาคอลัมน์ไหนออกครับ
dropna ใน pandas ผมใช้สำหรับกำจัดแถวหรือคอลัมน์ที่มีค่า NaN ออกจาก DataFrame ครับ เหมาะมากสำหรับขั้นตอนทำความสะอาดข้อมูลก่อนวิเคราะห์ เพราะค่า NaN แฝงอยู่ในข้อมูลจริงแทบทุกชุด
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่