5 Tips สำหรับผู้ใช้ Pandas

5 Tips สำหรับผู้ใช้ Pandas
Photo by Kirandeep Singh Walia
  • ผู้อ่านต้องมีพื้นฐาน
    • คุ้นเคยกับ Python การติดตั้ง Packages, การ Define Function และ การใช้งานพื้นฐานอื่น ๆ
    • มีความรู้ในการทำงานด้วย Pandas รวมถึงการจัดการข้อมูลพื้นฐาน
  • ในที่นี้ จะใช้ Python 3.7.1 บน Jupyter Notebook
  • ทำการติดตั้งทั้ง Pandas และ Seaborn

ข้อมูล

  • ใช้ “Tips Dataset” ที่อยู่ใน Seaborn 
# Import libraries 
import pandas as pd
import seaborn as sns

df = sns.load_dataset('tips')
print(f"{df.shape[0]} rows and {df.shape[1]} columns")
df.head()

Tip #1: Filter ด้วย query()

หากต้องการ Filter Rows ที่มีค่า Tip มากกว่า $6 และ Total Bill มากกว่า หรือ เท่ากับ $30

  • วิธีการทั่วไปที่ใช้ คือ 
df.loc[(df['tip']>6) & (df['total_bill']>=30)]
  • วิธีข้างต้น ต้องใส่หลายเงื่อนไข และ วงเล็บ หากต้องการผลลัพธ์เดียวกัน สามารถทำได้โดยใช้ query() ซึ่งดูง่ายกว่า
df.query("tip>6 & total_bill>=30")
  • ตัวอย่างเพิ่มเติม การใช้ query() 
# refer global variable name with @
median_tip = df['tip'].median()
display(df.query("tip>@median_tip").head())

# wrap column name containing . with backtick: `
df.rename(columns={'total_bill':'total.bill'}, inplace=True)
display(df.query("`total.bill`<20").head())
df.rename(columns={'total.bill':'total_bill'}, inplace=True)

# wrap string condition with single quotes (this is what I like)
display(df.query("day=='Sat'").head())
# could also do it the other way around (i.e. 'day=="Sat"')
  • ผลลัพธ์ที่ได้ คือ

Tip #2: แสดงผล multiple dataframes ด้วย display() 

  • สมมติว่า เราต้องการแสดงผล Head และ Tail โดยเขียนใน Cell เดียวกัน ทำได้โดย
display(df.head())
display(df.tail())
  • วิธีด้านล่าง จะให้ผลแบบเดียวกัน
display(df.head())
df.tail()

Tip #3a: ใช้ List ของ Booleans เมื่อSorting ด้วย Multiple Columns

  • การ Sorting (จัดเรียง) โดยใช้เงื่อนไขจาก Multiple Columns
  • หากต้อง Sorting ข้อมูล โดยใช้ Multi Columns ในทิศทางที่ต่างกัน เช่น Total Bill ในลำดับจากน้อยไปมาก และ Tip จากมากไปน้อย
  • วิธีหนึ่งที่สามารถทำได้ คือ ทำการ Reverse Tips  (หรือ Total Bill) เพื่อให้อยู่ในทิศทางเดียวกันก่อน แล้วทำการ Sorting ดังตัวอย่างด้านล่าง
df['rev_tip'] = -df['tip']
df.sort_values(by=['total_bill', 'rev_tip'], ascending=True).head()
  • จากตัวอย่าง สามารถทำให้เหลือ Code บรรทัดเดียว (ไม่ต้องสร้าง Column ใหม่) โดยใช้ List ของ Boolean ดังนี้
df.sort_values(by=[‘total_bill’, ‘tip’], ascending=[True, False]).head()
  • List ของ Boolean สามารถใช้เป็นตัวเลขได้ ascending =[1,0]

Tip #3b: ใช้ nsmallest() หรือ nlargest()

  • หากต้องการตรวจสอบข้อมูล โดยดูจาก ค่าน้อยที่สุด (หรือ มากที่สุด) ใน Column หนึ่ง สามารถใช้ nsmallest() ตัวอย่างเช่น 5 Records ที่มี Total Bill น้อยที่สุด 
df.nsmallest(5, 'total_bill')
  • วิธีด้านล่าง จะให้ผลแบบเดียวกัน
df.sort_values(by='total_bill').head()
  • ตัวอย่างถัดไป Code 2 บรรทัดด้านล่าง จะให้ผลแบบเดียวกัน
display(df.nlargest(5, 'total_bill'))
display(df.sort_values(by='total_bill', ascending=False).head())

Tip #4: Customise describe()

  • การใช้ df.describe() จะแสดงผล Summary Stats ของแต่ละ Numerical Column แต่สามารถทำได้มากกว่านั้น โดยใช้งาน Argument
  • ใช้ df.info() เพื่อดูข้อมูล
df.info()
  • เมื่อใช้ Argument include='all'
df.describe(include='all')
  • จากตัวอย่างที่ผ่านมา สามารถแยกผลลัพธ์ได้ โดยการเลือก Column Types
display(df.describe(include=['category'])) # categorical types
display(df.describe(include=['number'])) # numerical types
  • หากมีทั้ง String และ Categorical Columns และ ต้องการ แสดง Summary Stats ใน 1 Table ทำโดย include=['category', 'object'] หรือ exclude=['number']

Tip #5: Update default display settings

  • Tip นี้ จะเป็นการ Setting ค่า Display
  • หากต้องการทราบ จำนวนสูงสุดของ Columns และ Rows ที่แสดงผลได้ สามารถใช้ Code 
print(f"{pd.options.display.max_columns} columns")
print(f"{pd.options.display.max_rows} rows")
  • สามารถใช้ Code นี้ ได้ จะเห็นเพียง 10 Columns แรก และ 10 Columns สุดท้าย (แสดงทั้งหมด 20) ในขณะที่ส่วนที่เหลือจะเป็นสามจุด
  • หากต้องการเห็นทุก Columns และ Rows สามารถทำได้โดย
pd.options.display.max_columns = None
pd.options.display.max_rows = None
  • หรือ สามารถระบุจำนวน Columns และ Rows ที่ต้องการแสดงผล
pd.options.display.max_columns = 50
pd.options.display.max_rows = 100
  • บางครั้ง อาจพบสัญลักษณ์ทางวิทยาศาสตร์ สำหรับตัวเลขที่มาก ๆ หรือ น้อย ๆ เมื่อทำงานกับ Pandas หากง่ายกว่าที่จะอ่านตัวเลขเป็น 1200 และ 0.012 เมื่อเทียบกับ 1.2e3 และ 1.2e-2 ตามลำดับ 
  • สามารถใช้ Code นี้ ได้
pd.options.display.float_format = ‘{:.4f}’.format #4 decimal places

ข้อมูลอ้างอิง - https://towardsdatascience.com/5-tips-for-pandas-users-e73681d16d17