本篇文章主要為資料科學導論中的 Python 做資料前處理以及 DataFrame 所使用到的 Pandas lib 教學,用於描述如何安裝 Pandas 以及相關基礎方法介紹。
Pandas 介紹
Pandas 是 python 的一個數據分析 lib,2009 年底開源出來,提供高效能、簡易使用的資料格式(Data Frame)讓使用者可以快速操作及分析資料,主要特色描述如下:
- 在異質數據的讀取、轉換和處理上,都讓分析人員更容易處理,例如:從列欄試算表中找到想要的值。
- Pandas 提供兩種主要的資料結構,Series 與 DataFrame。Series 顧名思義就是用來處理時間序列相關的資料(如感測器資料等),主要為建立索引的一維陣列。DataFrame 則是用來處理結構化(Table like)的資料,有列索引與欄標籤的二維資料集,例如關聯式資料庫、CSV 等等。
- 透過載入至 Pandas 的資料結構物件後,可以透過結構化物件所提供的方法,來快速地進行資料的前處理,如資料補值,空值去除或取代等。
- 更多的輸入來源及輸出整合性,例如:可以從資料庫讀取資料進入 Dataframe,也可將處理完的資料存回資料庫。
安裝 Pandas
Python 安裝方式一樣都是透過 pip install 即可完成安裝,語法如下:
pip install pandas
其他介紹可以參考 官方網站
Pandas 讀取資料
可以從異質資料來源讀取檔案內容,並將資料放入 DataFrame 中,進行資料查看、資料篩選、資料切片等運算。
❖ 讀取 CSV 檔案
# 讀取 CSV File
import pandas as pd # 引用套件並縮寫為 pd
df = pd.read_csv('shop_list.csv')
print(df)
❖ 讀取 Html 檔案
# 讀取 HTML
import pandas as pd # 引用套件並縮寫為 pd
dfs = pd.read_html('http://rate.bot.com.tw/xrt?Lang=zh-TW')
dfs[0]
Pandas 提供的資料結構
- 1.Series:用來處理時間序列相關的資料(如感測器資料等),主要為建立索引的一維陣列。
- 2.DataFrame:用來處理結構化(Table like)的資料,有列索引與欄標籤的二維資料集,例如關聯式資料庫、CSV 等等。
- 3.Panel:用來處理有資料及索引、列索引與欄標籤的三維資料集。
1.Series
1.1 建立 Series
資料可以的類型如下:
- array
- dictionary
- 單一資料
import pandas as pd # 引用套件並縮寫為 pd
select = pd.Series(data, index = idx) #將資料讀入 series 方法中
❖ 資料為 Array
import pandas as pd # 引用套件並縮寫為 pd
cars = ["BMW", "BENZ", "Toyota", "Nissan", "Lexus"]
select = pd.Series(cars)
print(select)
Output 為:
0 BMW
1 BENZ
2 Toyota
3 Nissan
4 Lexus
dtype: object
❖ 資料為 Dictionary
import pandas as pd
dict = {
"factory": "Taipei",
"sensor1": "1",
"sensor2": "2",
"sensor3": "3",
"sensor4": "4",
"sensor5": "5"
}
select = pd.Series(dict, index = dict.keys()) # 排序與原 dict 相同
print(select[0])
print("=====")
print(select['sensor1'])
print("=====")
print(select[[0, 2, 4]])
print("=====")
print(select[['factory', 'sensor1', 'sensor3']])
Output 為:
❖ 資料為單一資料
import pandas as pd
cars = "BENZ"
select = pd.Series(cars, index = range(3))
print(select)
Output 為:
0 BENZ
1 BENZ
2 BENZ
dtype: object
1.2 Series 的操作
❖ 資料選擇與篩選
可以針對 dict 或是 array 資料透過透過索引值或標籤,挑選出你所要的值。
import pandas as pd
dict = {
"factory": "Taipei",
"sensor1": "1",
"sensor2": "2",
"sensor3": "3",
"sensor4": "4",
"sensor5": "5"
}
select = pd.Series(dict, index = dict.keys()) # 排序與原 dict 相同
print(select[0])
print("=====")
print(select['sensor1'])
print("=====")
print(select[[0, 2, 4]])
print("=====")
print(select[['factory', 'sensor1', 'sensor3']])
❖ 資料切片
透過透過索引值或標籤,切割需要的值。
import pandas as pd
dict = {
"factory": "Taipei",
"sensor1": "1",
"sensor2": "2",
"sensor3": "3",
"sensor4": "4",
"sensor5": "5"
}
select = pd.Series(dict, index = dict.keys()) # 排序與原 dict 相同
print(select[:2])
print("=====")
print(select['sensor2':])
Output 為:
2.DataFrame
2.1 建立 DataFrame
DataFrame 用來處理結構化(Table like)的資料,有列索引與欄標籤的二維資料集,可以透過 Dictionary 或是 Array 來建立,但也可以利用外部的資料來讀取後來建立,例如: CSV 檔案、資料庫等等。
下列範例會介紹利用 Dictionary 或是 Array 來建立,並使用 DataFrame 的方法來操作資料查看、資料篩選、資料切片、資料排序等運算。
❖ 資料為 Dictionary
import pandas as pd # 引用套件並縮寫為 pd
groups = ["Movies", "Sports", "Coding", "Fishing", "Dancing", "cooking"]
num = [46, 8, 12, 12, 6, 58]
dict = {"groups": groups,
"num": num
}
select_df = pd.DataFrame(dict)
print(select_df) # 看看資料框的外觀
Output 為:
❖ 資料為 Array
import pandas as pd
arr = groups = [["Movies", 46],["Sports", 8], ["Coding", 12], ["Fishing",12], ["Dancing",6], ["cooking",8]]
df = pd.DataFrame(arr, columns = ["name", "num"]) # 指定欄標籤名稱
print(df)
Output 為:
2.2 DataFrame 的操作
❖ 資料描述查看
可以透過下列方法查看目前資料的資訊
- .shape
- .describe()
- .head()
- .tail()
- .columns
- .index
- .info()
# Pandas 的 data frame 資料結構有一些方法或屬性
import pandas as pd
groups = ["Movies", "Sports", "Coding", "Fishing", "Dancing", "cooking"]
num = [46, 8, 12, 12, 6, 58]
dict = {"groups": groups,
"num": num
}
select_df = pd.DataFrame(dict)
print(select_df.shape) # 回傳列數與欄數
print("---")
print(select_df.describe()) # 回傳描述性統計
print("---")
print(select_df.head(3)) # 回傳前三筆觀測值
print("---")
print(select_df.tail(3)) # 回傳後三筆觀測值
print("---")
print(select_df.columns) # 回傳欄位名稱
print("---")
print(select_df.index) # 回傳 index
print("---")
print(select_df.info) # 回傳資料內容
Output 為:
❖ 資料選擇與篩選
可以透過下列方法選擇元素
- 中括號 [] 選擇元素
- . 將變數當作屬性選擇
- .loc .iloc 方法選擇
- 使用布林值篩選
# Pandas 透過使用中括號 [] 與 .iloc 可以很靈活地從 data frame 中選擇想要的元素
# Python 在指定 0:1 時不包含 1,在指定 0:2 時不包含 2
import pandas as pd
groups = ["Movies", "Sports", "Coding", "Fishing", "Dancing", "cooking"]
num = [46, 8, 12, 12, 6, 58]
dict = {"groups": groups,
"num": num
}
select_df = pd.DataFrame(dict)
print(select_df.iloc[0, 1]) # 第一列第二欄:組的人數
print("---")
print(select_df.iloc[0:1,:]) # 第一列:組的組名與人數
print("---")
print(select_df.iloc[:,1]) # 第二欄:各組的人數
print("---")
print(select_df["num"]) # 各組的人數
print("---")
print(select_df.num) # 各組的人數
Output 為:
使用布林值來做篩選
import pandas as pd
groups = ["Movies", "Sports", "Coding", "Fishing", "Dancing", "cooking"]
num = [46, 8, 12, 12, 6, 58]
dict = {"groups": groups,
"num": num
}
select_df = pd.DataFrame(dict)
out_df = select_df[select_df.loc[:,"num"] > 10] # 選出人數超過 10 的群組
print(out_df)
Output 為:
❖ 資料排序
可以使用的方法如下:
- .sort_index()
- .sort_values()
import pandas as pd # 引用套件並縮寫為 pd
groups = ["Movies", "Sports", "Coding", "Fishing", "Dancing", "cooking"]
num = [46, 8, 12, 12, 6, 58]
dict = {"groups": groups,
"num": num
}
select_df = pd.DataFrame(dict)
select_df.sort_index(axis = 0, ascending = True) # 透過索引值做排序,axis 可以指定第幾欄,ascending 用於設定升冪或降密
Output 為:
import pandas as pd # 引用套件並縮寫為 pd
groups = ["Movies", "Sports", "Coding", "Fishing", "Dancing", "cooking"]
num = [46, 8, 12, 12, 6, 58]
dict = {"groups": groups,
"num": num
}
select_df = pd.DataFrame(dict)
select_df.sort_values(by = 'num') #透過指定欄位的數值排序
Output 為:
2.3 DataFrame 處理遺漏值
❖ 判斷是否為空值
可以使用下列兩種方法來判斷:
- isnull()
- notnull()
下列程式我們先讀取一個 CSV 檔案,檔案內的欄位部分會有空值,檔案連結 大家可以自行下載
# 讀取 CSV File
import pandas as pd # 引用套件並縮寫為 pd
df = pd.read_csv('shop_list2.csv')
print(df)
# 讀取後放入 DataFrame
select_df = pd.DataFrame(df)
print(select_df.ix[:, "shop name"].isnull()) # 判斷哪些店名是遺失值
print("---")
print(select_df.ix[:, "maket size"].notnull()) # 判斷哪些市場規模不是遺失值
# 可以透過 ix 方法(利用索引值或欄位)選擇 data frame 區段
Output 為:
❖ 處理空值
可以使用下列兩種方法來填補空值:
- dropna()
- fillna()
# 讀取 CSV File
import pandas as pd # 引用套件並縮寫為 pd
df = pd.read_csv('shop_list2.csv')
print(df)
# 讀取後放入 DataFrame
select_df = pd.DataFrame(df)
drop_value = select_df.dropna() # 有遺失值的觀測值都刪除
print(drop_value)
print("---")
filled_value = select_df.fillna(0) # 有遺失值的觀測值填補 0
print(filled_value)
print("---")
filled_value_column = select_df.fillna({"shop name": "NULL", "maket size": 0}) # 依欄位填補遺失值
print(filled_value_column)
Output 為: