iT邦幫忙

2021 iThome 鐵人賽

DAY 19
0
AI & Data

從資料庫到資料分析視覺化系列 第 19

{DAY 19} Pandas 學習筆記part.5

  • 分享至 

  • xImage
  •  

前言

這篇文章會進行到更多的資料操作

將會分成兩個部分:

  1. DataFrame Loading
  2. 用條件選擇出資料

首先在一大筆資料未必每個資料都會使用到

所以如何透過條件篩選出符合特定條件的資料

是進行資料分析最基本的操作

因為篩選資料的語法會根據使用情境的不同而有各式各樣的對應語法

在這篇文章會使用到最基本的布林值操作還有比較運算元

使用上如果需要更多的應用可以去stakeoverflow上找

因為比起用堆疊布林運算元跟比較運算元

pandas身為專門用來資料處理的工具

可能會有更為簡便的操作語法

會繼續利用kaggle上的開源資料進行更多的pandas練習

Kaggle: Your Machine Learning and Data Science Community

看的課程還是Coursera上的 Introduction to Data Science in Python

Coursera | Online Courses & Credentials From Top Educators. Join for Free | Coursera

練習是利用上述課程裡教的搭配以前在學校學過的知識

整裡並且搭配實際的資料檔

整理出來的筆記

DataFrame Loading

大多數的時候當我們想要進行資料分析

會需要連結到外部的資料庫

而外部資料的檔案多使用的形式為.csv檔

csv檔為常見的資料儲存格式

每個資料之間利用逗號隔開

在使用python時

處理這種資料會需要蠻繁複的手續

讀進來後要先處理逗號

並且處理欄跟列的名稱

但是在pandas套件裡有強大的dataframe處理功能

可以用簡單的pd.read_csv( )

直接將csv檔讀取並且排列成易讀性高dataframe

讓資料的分析更為快速簡便

現在利用kaggle上電信公司的顧客資訊來實際練習

將外部的csv檔讀進來進行

進行接續更多的資料操作練習

這裏使用的是"Telo Customer Churn"的檔案

是一筆有關電信公司的顧客資料

Telco Customer Churn

首先先將csv檔案讀進來

利用pd.read_csv( )

import pandas as pd
df = pd.read_csv("WA_Fn-UseC_-Telco-Customer-Churn.csv")
df.head()

這是輸出的部分截圖

可以看到row的index是default的從0開始的數據

若是我們想要將index設為customerID

可以再把檔案讀進來的時候,增加一個index=" " 的參數

df = pd.read_csv("WA_Fn-UseC_-Telco-Customer-Churn.csv", index_col = 0)
df.head()

可以看到index換成了ciustomerID

很多時候會需要更改column的名稱

讓資料的易讀性提高

若是我們想要讓column的名稱全部都用小寫表示

# 首先先讓column的名稱變成list
cols = list(df.columns)
# 接下來讓他們全部變成小寫lower(),為了避免空格的問題,可以使用strip()
cols = [x.lower().strip() for x in cols]
# 複製一個資料表
copy_df = df.copy()
# 讓新的list取代原本的欄位名稱
copy_df.columns = cols
copy_df.head()

可以看到column的名稱全部變成小寫

用條件選擇出資料

資料是延續上篇文章使用到的

用的是"Telo Customer Churn"的檔案

一筆有關電信公司的顧客資料

Telco Customer Churn

先來回顧一下這筆資料長怎樣

df.head()

在上篇學會了基本的資料查詢語法

這裡要學著用布林遮罩來選取符合特定條件的資料

假如現在想找出顧客裡是女生的資料

female = df["gender"] == "Female"
female
'''
customerID
7590-VHVEG     True
5575-GNVDE    False
3668-QPYBK    False
7795-CFOCW    False
9237-HQITU     True
              ...  
6840-RESVB    False
2234-XADUH     True
4801-JZAZL     True
8361-LTMKD    False
3186-AJIEK    False
Name: gender, Length: 7043, dtype: bool
'''

可以看到回傳的資料會用True,False的布林值表示

若是想要在回傳的資料表裡隱藏False的數值,可以使用.where()

df.where(female).head()

可以看到有False的欄位(所有性別是Male的)都變成NaN

若是想要只輸出留下Yes的資料,可以用到.dropna( )

df.where(female).dropna().head()

可以從gender欄位看到剩下的都是Female的資料

在pandas裡有更為簡便的手法取出符合特定條件的資料,可以使用[indexing operator]即可

df[df["gender"]=="Female"].head()

可以很簡潔地得到性別為女生的資料

當我們想找MonthlyCharges介於50到100有哪些人

  1. 可以利用比較元進行運算

    先產生出一個由布林值構成的 series

    filter = (df["MonthlyCharges"] > 50) & (df["MonthlyCharges"]<100) # 記得要用括號
    filter
    '''
    customerID
    7590-VHVEG    False
    5575-GNVDE     True
    3668-QPYBK     True
    7795-CFOCW    False
    9237-HQITU     True
                  ...  
    6840-RESVB     True
    2234-XADUH    False
    4801-JZAZL    False
    8361-LTMKD     True
    3186-AJIEK    False
    Name: MonthlyCharges, Length: 7043, dtype: bool
    '''
    
  2. 使用 built-in function的方法

    .gt() 表示greater than
    .lt() 表示lower than

    df["MonthlyCharges"].gt(50) & df["MonthlyCharges"].lt(100)
    '''
    customerID
    7590-VHVEG    False
    5575-GNVDE     True
    3668-QPYBK     True
    7795-CFOCW    False
    9237-HQITU     True
                  ...  
    6840-RESVB     True
    2234-XADUH    False
    4801-JZAZL    False
    8361-LTMKD     True
    3186-AJIEK    False
    Name: MonthlyCharges, Length: 7043, dtype: bool
    '''
    

    由於這是built-in在Series和DataFrame的,所以可以利用chain連接一起使用

    df["MonthlyCharges"].gt(50).lt(100)
    '''
    customerID
    7590-VHVEG    False
    5575-GNVDE     True
    3668-QPYBK     True
    7795-CFOCW    False
    9237-HQITU     True
                  ...  
    6840-RESVB     True
    2234-XADUH    False
    4801-JZAZL    False
    8361-LTMKD     True
    3186-AJIEK    False
    Name: MonthlyCharges, Length: 7043, dtype: bool
    '''
    

    小結

這篇文章練習到如何篩選資料

可以看到搭配實際資料檔案應用後的效果

在篩選資料時要注意到括號的使用

像是(df["MonthlyCharges"] > 50) & (df["MonthlyCharges"]<100)

如果兩個條件沒有用括號匡起來

變成這樣df["MonthlyCharges"] > 50 & df["MonthlyCharges"]<100

會無法成功運作kernel而跑不出想要的答案

也要記得同樣的處理方式

若是有更簡便的語法可以使用

可以針對易讀性下去判斷是否要使用


上一篇
{DAY 18} Pandas 學習筆記part.4
下一篇
{DAY 20} Pandas 學習筆記part.6
系列文
從資料庫到資料分析視覺化30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言