這篇文章會進行到更多的資料操作
將會分成兩個部分:
首先在一大筆資料未必每個資料都會使用到
所以如何透過條件篩選出符合特定條件的資料
是進行資料分析最基本的操作
因為篩選資料的語法會根據使用情境的不同而有各式各樣的對應語法
在這篇文章會使用到最基本的布林值操作還有比較運算元
使用上如果需要更多的應用可以去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
練習是利用上述課程裡教的搭配以前在學校學過的知識
整裡並且搭配實際的資料檔
整理出來的筆記
大多數的時候當我們想要進行資料分析
會需要連結到外部的資料庫
而外部資料的檔案多使用的形式為.csv檔
csv檔為常見的資料儲存格式
每個資料之間利用逗號隔開
在使用python時
處理這種資料會需要蠻繁複的手續
讀進來後要先處理逗號
並且處理欄跟列的名稱
但是在pandas套件裡有強大的dataframe處理功能
可以用簡單的pd.read_csv( )
直接將csv檔讀取並且排列成易讀性高dataframe
讓資料的分析更為快速簡便
現在利用kaggle上電信公司的顧客資訊來實際練習
將外部的csv檔讀進來進行
進行接續更多的資料操作練習
這裏使用的是"Telo 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"的檔案
一筆有關電信公司的顧客資料
先來回顧一下這筆資料長怎樣
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有哪些人
可以利用比較元進行運算
先產生出一個由布林值構成的 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
'''
使用 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而跑不出想要的答案
也要記得同樣的處理方式
若是有更簡便的語法可以使用
可以針對易讀性下去判斷是否要使用