[Pandas — Part II] การเลือก Rows , Columns และ Row Filtering ใน Pandas

Supalerk Pisitsupakarn
Data Cafe Thailand
Published in
4 min readApr 2, 2020

จากโพสที่แล้ว [Pandas-Part I] ตรวจสุขภาพ Data เบื้องต้น ในโพสนี้จะเป็นการพูดถึงวิธีการเลือก Rows และ Columns ที่เราต้องการใน DataFrame

เริ่มต้นจากการที่มี DataFrame ที่ชื่อว่า df_transac

df_transac.head(10)
รูปที่ 1 : ตัวอย่างข้อมูล 10 บรรทัดแรกของ df_transac

การเลือก Column(s) จาก DataFrame

  • แสดงค่าในคอลัมน์เป็น Series
# dataframe['your_column_name']
df_transac['cus_id']
รูปที่ 2 : ผลลัพธ์ที่เป็น Series จากคอลัมน์ cus_id
  • แสดงค่าในคอลัมน์เป็น DataFrame

ลักษณะเหมือนเรานำคอลัมน์ที่เราอยากจะแสดง มาใส่ไว้ใน List ก่อน แล้วค่อยนำไปใส่ใน DataFrame อีกที

# dataframe[['your_column_name']]
df_transac[['cust_id']]
รูปที่ 3 : ผลลัพธ์ที่เป็น DataFrame จากคอลัมน์ cust_id
  • แสดงค่าหลายๆคอลัมน์เป็น DataFrame

สามารถทำได้โดย เพิ่มคอลัมน์ที่ต้องการลงไปใน List โดยสมาชิกใน List จะมี 1 ค่า หรือมากกว่า 1 ค่า ก็ได้

# cols = ['your_column1','your_column2',..,'your_columnN']
# dataframe[selected_col]
my_cols = ['cust_id','tran_date','total_amt','Store_type']
df_transac[my_column]
รูปที่ 3 : ผลลัพธ์ที่เป็น DataFrame จากชื่อคอลัมน์ที่เก็บอยู่ในตัวแปร my_cols

แต่เอ๊ะ ! แล้ว Series กับ DataFrame ต่างกันอย่างไร ??

จริงๆต้องบอกว่า Series กับ DataFrame จะคล้ายๆกัน DataFrame เกิดจาก Series หลายๆ Series มาประกอบกัน ซึ่งSeries จะมี 1 dimension แต่ DataFrame จะมี 2 dimensions จากเดิมที่ใช้เพียง df_transac[‘cust_id’] ซึ่งด้านใน square brackets (ปีกกาสี่เหลี่ยม) เป็นชื่อคอลัมน์ที่มี Data Type เป็น String สามารถเปลี่ยนเป็น 2 dimensions ได้โดยเปลี่ยนจาก Data Type String เป็น List แทน ซึ่งใน List นั้นสามารถใส่ชื่อคอลัมน์ที่ต้องการลงไปจะมีสมาชิกเพียง 1 ตัว หรือจะมีมากกว่า 1 ตัวก็ได้ เพียงเท่านี้เราก็จะได้ DataFrame ที่มีคอลัมน์ที่ต้องการออกมาแล้ว

ซึ่งการเรียกใช้งานก็จะแล้วแต่กรณีเพราะ Series และ DataFrame จะมี Method ที่สามารถเรียกใช้ได้ไม่เหมือนกัน หลักๆที่จะเรียกใช้ Series ก็เพื่อดูรายละเอียดของข้อมูลทีละ 1 คอลัมน์ รวมไปถึงการสร้างคอลัมน์ใหม่ และเอาไปเก็บไว้ใน DataFrame

การเลือกแถว และ คอลัมน์

การที่จะเลือกแถว และคอลัมน์ นั้นเราจะต้องระบุว่าต้องการจะเลือกข้อมูลที่อยู่ใน แถวอะไร และคอลัมน์อะไร หรือ Location ที่มีข้อมูลที่ต้องการอยู่นั้นเอง ซึ่งมี 2 วิธี ดังนี้

  1. loc : การที่จะใช้ loc นั้น จะต้องระบุชื่อของแถวและ ชื่อของคอลัมน์ลงไปตรงๆ
# dataframe.loc[‘index_name’ , ‘column_name’]

2. iloc : การที่จะใช้ iloc นั้นไม่สนใจชื่อ แต่สนใจตำแหน่งของแถว และ ตำแหน่งของคอลัมน์

dataframe.iloc[‘row_index_number’ , ‘column_index_number’] 
รูปที่ 4 : ตัวอย่างข้อมูลจาก df_transac โดยแสดงให้เห็นถึงชื่อและตำแหน่งของ แถวและคอลัมน์

Remark : ในข้อมูล df_transac ข้อมูลไม่ได้มีชื่อ index_name แต่ในรูปที่ 4 ผมใส่ชื่อ index_name ลงไปเพื่อให้เห็นความแตกต่างระหว่าง loc กับ iloc ชัดเจนมากยิ่งขึ้น

การเลือกแถวและคอลัมน์แบบระบุ

วิธีนี้เราสามารถที่จะระบุลงไปได้ตรงๆเลยว่าอยากจะได้แถวอะไรและคอลัมน์อะไร

รูปที่ 5 : ตัวอย่างการเลือก df_transac แบบระบุแถวและคอลัมน์
  • ใช้ loc เลือกแถวและคอลัมน์แบบระบุ (จากชื่อ)
# Use loc get data from picture 5 
# rows D and F
# columns cust_id and prod_cat_code
df_transac.loc[['D','F'] , ['cust_id' ,'prod_cat_code']]
  • ใช้ iloc เลือกแถวและคอลัมน์แบบระบุ (จากตำแหน่ง)
# Use iloc get data from picture 5 
# rows 3 and 5
# columns 1 and 4
df_transac.iloc[[ 3 , 5 ] , [ 1 ,4 ]]

การเลือกแถวและคอลัมน์แบบ Slicing

จะใช้เมื่อต้องการแถวหรือคอลัมน์ที่อยู่ติดๆกันจำนวนมากๆ เช่นต้องการ 20 คอลัมน์ ที่อยู่ติดๆกัน จะให้พิมพ์ชื่อคอลัมน์ทั้งหมดก็อาจจะเหนื่อยได้ 5555+ การทำ slicing นั้นจะตั้งใส่ตำแหน่งที่จะเริ่ม และตำแหน่งสิ้นสุด โดยจะมี “ : ” อยู่ตรงกลาง ถ้าเราไม่ได้ใส่ตำแหน่งเริ่มต้นไป สิ่งที่จะได้ออกมาก็คือตำแหน่งแรกสุดของ DataFrame จนถึงตำแหน่งสุดท้ายที่เลือกไว้ และ ถ้าหากไม่ได้ระบุตำแหน่งสิ้นสุดลงไป สิ่งที่จะได้ออกมาคือตำแหน่งที่เริ่มต้นที่เลือกไว้ จนถึงตำแหน่งสุดท้ายของ DataFrame

รูปที่ 6: ตัวอย่างข้อมูลจาก df_transac แบบ Slicing
  • ใช้ loc แบบ slicing
# Use loc get data from picture 6
# rows between D and F
# columns between cust_id and prod_cat_code
df_transac.loc['D':'F' , 'cust_id' : 'prod_cat_code']
  • ใช้ iloc แบบ slicing
รูปที่ 7 : Statement ของคำสั่ง iloc แบบ slicing

สิ่งที่จะต้องระวังในการใช้ iloc คือตำแหน่งที่เราจะ slicing ตัวแรกนั้นจะ include ส่วนตัวหลังจะ exclude เช่นหากต้องการข้อมูลในช่องสีส้ม ข้อมูลจะอยู่ในแถวที่ 3 จนถึง 5 และคอลัมน์ที่ 1 จนถึง 4 เพื่อให้ได้ค่าที่ถูกต้อง เราจะต้อง +1 ไปที่ตำแหน่ง Stop ทั้งฝั่งแถว และฝั่งคอลัมน์

# Use iloc grab data from picture 6
# rows between 3 and 5+1
# columns between 1 and 4+1
df_transac.iloc[ 3 : 6 , 1 : 5 ]

loc และ iloc จะใช้เมื่อต้องการจะเปลี่ยนแปลงค่าต่างๆใน DataFrame โดยการใช้ loc หรือ iloc เรียก ค่าที่อยู่ในแถวและคอลัมน์ที่ต้องการออกมา แล้วกำหนดค่าใหม่ลงไปได้เลย

Takeaway note :ในการใช้งานจริงก็อาจจะเลือกใช้ตามสถานะการณ์ แต่ส่วนตัวชอบใช้แบบ loc มากกว่า เพราะเมื่อเวลาทำ Data manipulation มากๆ ตำแหน่งของคอลัมน์จะมีการเปลี่ยนแปลงจากการสร้างคอลัมน์เพิ่มขึ้น หรือตัดบางคอลัมน์ออก ซึ่งนอกจากจะป้องกันการผิดพลาดที่อาจจะเกิดแล้ว ยังทำให้สามารถอ่าน Code ได้ง่ายขึ้นด้วยครับ

Row Filtering ***

เป็นการเลือก Filter ข้อมูลภายใต้ Conditions ที่กำหนด ซึ่งถือว่าเป็นคำสั่งที่สำคัญและใช้บ่อยมากๆ

Relational Operator ที่จะให้ผลลัพธ์ออกมาเป็น True หรือ False ใน Python

>   มากกว่า
>= มากกว่าหรือเท่ากับ
< น้อยกว่า
<= น้อยกว่าหรือเท่ากับ
== เท่ากับ
!= ไม่เท่ากับ

โดยสรุปก็คือผลลัพธ์ที่จะแสดงออกมานั้นจะต้องผ่านทุก Conditions หรือ มีค่าเป็น True ทั้งหมด

ตัวอย่างข้อมูลที่จำลองขึ้นมาเพื่ออธิบายการทำ Row Filtering

รูปที่ 8 : ตัวอย่างข้อมูลเพื่อใช้ในการทำ Row Filtering
  • 1 Condition

ทำเหมือนเลือก Column ที่ต้องการ แต่ด้านในของ “[]” ให้ใส่เป็น Condition แทน ถ้าหากเรา Run คำสั่ง df_transac[‘Qty’] ≥ 2 เราจะได้ Series ที่เก็บค่า True และ False ออกมา พร้อมกับ row_index จากนั้นให้นำไปใส่ใน “[]” ของ DataFrame เป็นการบอก DataFrame ว่า “เอา index ที่เป็น True ออกมาแสดง”

# Display all rows where Qty >= 2
condition_1 = df_transac['Qty'] >= 2
df_transac[ condition_1 ]
รูปที่ 9 : ตัวอย่างการ filter rows ด้วย condition Qty ≥ 2

จากรูปที่ 9 ตารางทางฝั่งขวาคือ ตารางที่ผ่านการ Filter แล้วซึ่งจะสังเกตุได้ว่า ทุกแถวจะมี Qty ≥ 2 ทั้งหมด

  • มากกว่า 1 Conditions

หากต้องการ filter มากกว่า 1 conditions ให้ใส่ “()” ครอบลงไปในแต่ละ condition และใส่ “&” ลงไประหว่าง condition

# Display all rows where Qty >= 2 and Store_type = 'e-Shop'condition_1 = df_transac['Qty'] >= 2
condition_2 = df_transac['Store_type'] =='e-Shop'
df_transac[ (condition_1) & (condition_2)]
รูปที่ 10 : ตัวอย่างการ filter rows ด้วย condition Qty ≥ 2 และ Store_type = ‘e-Shop’

จากรูปที่ 10 ผลลัพธ์ที่จะเกิดขึ้นนั้นจะต้องผ่าน หรือ มีค่าเป็น True ในทุก Condition ที่กำหนด สังเกตจากตารางขวามือ ก็จะได้แถวที่มี Qty ≥ 2 และ Store_type = ‘e-Shop’ ซึ่งหลังจากที่ทำ Row Filtering แล้วก็สามารถสร้างตัวแปรมาเก็บตาราง ไว้ใช้งานต่อได้

จบไปแล้วครับสำหรับ การเลือก Rows เลือก Columns รวมไปถึงการทำ Row Filtering ซึ่งถือว่าเป็นคำสั่งที่จะใช้ในการทำงานจริงบ่อยมากๆ สำหรับโพสหน้าจะเป็นเรื่องการใช้ Group by , Pivot Table และ Melt สำหรับผู้ที่สนใจ ก็สามารถติดตามได้เลยนะครับ :D

--

--