DataFrame
คืน DataFrame ใหม่ที่ลบคอลัมน์หรือแถวที่ระบุออกแล้วครับ df ต้นฉบับไม่ถูกแตะ ต้องเก็บผลลัพธ์ไว้ในตัวแปรใหม่เอง สามารถ chain ต่อได้ทันที เช่น .drop(…).reset_index()
| อาร์กิวเมนต์ | ชนิด | คำอธิบาย |
|---|---|---|
| [labels]ไม่บังคับ | str | list | ชื่อคอลัมน์หรือ index ของแถวที่จะลบ ใช้คู่กับ axis เพื่อบอกว่าลบแนวไหน แต่ผมแนะนำใช้ columns= หรือ index= แทน อ่านชัดกว่าครับ |
| [axis]ไม่บังคับ | int | str | 0 หรือ ‘index’ = ลบแถว, 1 หรือ ‘columns’ = ลบคอลัมน์ ใช้คู่กับ labels= เท่านั้น ถ้าใช้ columns= หรือ index= ไม่ต้องระบุ axis ครับ |
| [columns]ไม่บังคับ | str | list | ชื่อคอลัมน์ที่จะลบ บอกตรงๆ โดยไม่ต้องระบุ axis เลย เขียนสั้นกว่า เช่น columns=’age’ หรือ columns=[‘a’,’b’] ครับ |
| [index]ไม่บังคับ | int | str | list | ชื่อหรือเลข index ของแถวที่จะลบโดยตรง เช่น index=0 ลบแถวแรก หรือ index=[1,3] ลบแถวที่ 1 และ 3 ครับ |
[ ] = อาร์กิวเมนต์ที่ไม่บังคับ
drop เป็นฟังก์ชันที่ผมใช้บ่อยมากตอนทำความสะอาดข้อมูลครับ หลักการคือบอกชื่อที่อยากลบ แล้วมันจะคืน DataFrame ใหม่ที่ไม่มีของชิ้นนั้นให้เราครับ
ใน pandas เราสามารถลบได้ 2 ทิศทาง:
– ลบ **คอลัมน์** → ใช้ `columns=’ชื่อ’` หรือ `axis=1`
– ลบ **แถว** → ใช้ `index=[เลขแถว]` หรือ `axis=0`
ผมแนะนำให้ใช้ `columns=` และ `index=` แทน `axis=` นะครับ อ่านง่ายกว่าและโอกาสสับสนน้อยกว่ามาก
ที่เจ๋งคือ drop ต่างจาก dropna ตรงที่ **เราระบุชื่อที่จะลบเองได้เลย** ไม่ต้องรอให้เป็น NaN drop = ลบตามชื่อที่สั่ง, dropna = ลบแถวที่มีค่าว่าง NaN อยู่ครับ 😎
ส่วนตัวผมใช้ drop บ่อยสุดตอนโหลดข้อมูลจาก Excel แล้วมีคอลัมน์ Unnamed หรือคอลัมน์ที่ไม่เกี่ยวข้องติดมาด้วย แค่ระบุชื่อแล้วสั่ง drop ก็เรียบร้อยครับ
ผมลบคอลัมน์ age ออกจาก DataFrame โดยใช้ columns='age' ครับ ได้ DataFrame ใหม่ที่มีแค่ name กับ salary แล้ว เหมือนคลิกขวาลบคอลัมน์ใน Excel เลย ข้อมูลต้นฉบับ df ยังอยู่ครบไม่หายไปนะครับ
ใส่เป็น list ใน columns= ก็ลบได้หลายคอลัมน์พร้อมกันเลยครับ ผมใส่ ['age', 'dept'] ก็ได้ DataFrame ที่เหลือแค่ id, name, salary ออกมา สะดวกมากตอนมีหลายคอลัมน์ที่ไม่ต้องการ
ผมลบแถวที่ index เป็น 1 และ 3 ออก เหลือแค่แถว Alice กับ Charlie ที่ score ดีอยู่ครับ วิธีนี้ใช้ได้เลยถ้าเรารู้ index ของแถวที่ไม่ต้องการ เหมือนการ Delete Row ใน Excel แบบระบุเลขแถวครับ
ผมชอบ chain ต่อหลัง drop ครับ ในตัวอย่างนี้ลบ temp_col แล้วต่อด้วย reset_index เพื่อ reset เลข index ให้เรียงใหม่ตั้งแต่ 0 ถ้าอยากเก็บผลไว้ใช้ต่อก็แค่ df_clean = df.drop(columns='temp_col') แล้วเอา df_clean ไปทำต่อได้เลยครับ
ต่างกันมากเลยครับ drop = เราระบุชื่อคอลัมน์หรือแถวที่อยากลบเองโดยตรง เช่น drop(columns='age') แบบนี้รู้เลยว่าจะเอาอะไรออก ส่วน dropna = ลบแถวที่มีค่า NaN (ค่าว่าง) อยู่โดยอัตโนมัติ ไม่ต้องระบุชื่อ แค่บอกว่า "ถ้าแถวไหนมีค่าว่าง ลบทิ้งเลย" สรุปคือ drop ใช้ตอนรู้ชื่อ dropna ใช้ตอนไล่ล่า NaN ครับ
เพราะ drop ไม่ได้แก้ df ต้นฉบับครับ มันคืน DataFrame ใหม่ให้เรา ผมเจอปัญหานี้บ่อยมากตอนเริ่มใช้ใหม่ๆ วิธีแก้คือเก็บผลลัพธ์ไว้ก่อน เช่น df_clean = df.drop(columns='age') แล้วค่อยใช้ df_clean ต่อ หรือถ้าอยากแทนที่ df ตรงๆ ก็ df = df.drop(columns='age') เลยก็ได้ครับ
จะได้ KeyError ครับ pandas จะหยุดทำงานแล้วบอกว่าหาคอลัมน์นั้นไม่เจอ ถ้าไม่แน่ใจว่าคอลัมน์นั้นมีอยู่ไหม ผมแนะนำให้ตรวจด้วย df.columns ก่อน หรือถ้าอยากให้ข้ามไปเฉยๆ เมื่อไม่เจอ ก็ใส่ errors='ignore' เพิ่มเข้าไปได้ครับ เช่น df.drop(columns='maybe_col', errors='ignore')
ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas drop จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
drop_duplicates ใน pandas ผมใช้สำหรับลบแถวข้อมูลที่ซ้ำกันออกจาก DataFrame เหมือนกับปุ่ม Remove Duplicates ใน Excel เลยครับ แต่ยืดหยุ่นกว่าตรงที่เราเลือกได้ว่าจะดูซ้ำจากคอลัมน์ไหน และจะเก็บแถวแรกหรือแถวสุดท้ายไว้
dropna ใน pandas ผมใช้สำหรับกำจัดแถวหรือคอลัมน์ที่มีค่า NaN ออกจาก DataFrame ครับ เหมาะมากสำหรับขั้นตอนทำความสะอาดข้อมูลก่อนวิเคราะห์ เพราะค่า NaN แฝงอยู่ในข้อมูลจริงแทบทุกชุด
rename ใน pandas ผมใช้สำหรับเปลี่ยนชื่อคอลัมน์หรือ index ใน DataFrame โดยส่ง dict บอกว่า 'ชื่อเดิม' ควรกลายเป็น 'ชื่อใหม่' อะไร เหมือนการ Rename column header ใน Excel แต่ทำแบบโปรแกรมได้ครับ
reset_index ผมใช้สำหรับเปลี่ยน index ของ DataFrame กลับมาเป็นคอลัมน์ธรรมดา แล้วเซ็ต index ใหม่เป็น 0, 1, 2, … ตามลำดับ — ส่วนใหญ่จะโผล่หลัง groupby ทุกครั้งที่อยากนำผลลัพธ์ไปใช้งานต่อครับ
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่