drop ใน pandas ผมใช้สำหรับตัดคอลัมน์หรือแถวที่ไม่ต้องการออกจาก DataFrame โดยระบุชื่อเองโดยตรง เหมือนการ “ลบคอลัมน์” ใน Excel แบบเลือกได้เป๊ะๆ ว่าจะเอาคอลัมน์ไหนออกครับ
df.drop(labels, axis, columns, index)
df.drop(labels, axis, columns, index)
DataFrame
คืน DataFrame ใหม่ที่ลบคอลัมน์หรือแถวที่ระบุออกแล้วครับ df ต้นฉบับไม่ถูกแตะ ต้องเก็บผลลัพธ์ไว้ในตัวแปรใหม่เอง สามารถ chain ต่อได้ทันที เช่น .drop(…).reset_index()
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| labels | str | list | Optional | ชื่อคอลัมน์หรือ index ของแถวที่จะลบ ใช้คู่กับ axis เพื่อบอกว่าลบแนวไหน แต่ผมแนะนำใช้ columns= หรือ index= แทน อ่านชัดกว่าครับ | |
| axis | int | str | Optional | 0 | 0 หรือ ‘index’ = ลบแถว, 1 หรือ ‘columns’ = ลบคอลัมน์ ใช้คู่กับ labels= เท่านั้น ถ้าใช้ columns= หรือ index= ไม่ต้องระบุ axis ครับ |
| columns | str | list | Optional | ชื่อคอลัมน์ที่จะลบ บอกตรงๆ โดยไม่ต้องระบุ axis เลย เขียนสั้นกว่า เช่น columns=’age’ หรือ columns=[‘a’,’b’] ครับ | |
| index | int | str | list | Optional | ชื่อหรือเลข index ของแถวที่จะลบโดยตรง เช่น index=0 ลบแถวแรก หรือ index=[1,3] ลบแถวที่ 1 และ 3 ครับ |
df.drop(columns='age')df.drop(columns='age')
name salary
0 Alice 50000
1 Bob 60000
2 Charlie 70000
df.drop(columns=['age', 'dept'])df.drop(columns=['age', 'dept'])
id name salary
0 1 Alice 50000
1 2 Bob 60000
2 3 Charlie 70000
df.drop(index=[1, 3])df.drop(index=[1, 3])
name score
0 Alice 90
2 Charlie 80
df.drop(columns='temp_col').reset_index(drop=True)df.drop(columns='temp_col').reset_index(drop=True)
name age salary
0 Alice 25 50000
1 Bob 30 60000
ต่างกันมากเลยครับ 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’)
drop เป็นฟังก์ชันที่ผมใช้บ่อยมากตอนทำความสะอาดข้อมูลครับ หลักการคือบอกชื่อที่อยากลบ แล้วมันจะคืน DataFrame ใหม่ที่ไม่มีของชิ้นนั้นให้เราครับ
ใน pandas เราสามารถลบได้ 2 ทิศทาง:
– ลบ **คอลัมน์** → ใช้ `columns=’ชื่อ’` หรือ `axis=1`
– ลบ **แถว** → ใช้ `index=[เลขแถว]` หรือ `axis=0`
ผมแนะนำให้ใช้ `columns=` และ `index=` แทน `axis=` นะครับ อ่านง่ายกว่าและโอกาสสับสนน้อยกว่ามาก
ที่เจ๋งคือ drop ต่างจาก dropna ตรงที่ **เราระบุชื่อที่จะลบเองได้เลย** ไม่ต้องรอให้เป็น NaN drop = ลบตามชื่อที่สั่ง, dropna = ลบแถวที่มีค่าว่าง NaN อยู่ครับ 😎
ส่วนตัวผมใช้ drop บ่อยสุดตอนโหลดข้อมูลจาก Excel แล้วมีคอลัมน์ Unnamed หรือคอลัมน์ที่ไม่เกี่ยวข้องติดมาด้วย แค่ระบุชื่อแล้วสั่ง drop ก็เรียบร้อยครับ