[Python] Pandas 基礎教學

本篇文章主要為資料科學導論中的 Python 做資料前處理以及 DataFrame 所使用到的 Pandas lib 教學,用於描述如何安裝 Pandas 以及相關基礎方法介紹。


Pandas 介紹

Pandas 是 python 的一個數據分析 lib,2009 年底開源出來,提供高效能、簡易使用的資料格式(Data Frame)讓使用者可以快速操作及分析資料,主要特色描述如下:

  1. 在異質數據的讀取、轉換和處理上,都讓分析人員更容易處理,例如:從列欄試算表中找到想要的值。
  2. Pandas 提供兩種主要的資料結構,Series 與 DataFrame。Series 顧名思義就是用來處理時間序列相關的資料(如感測器資料等),主要為建立索引的一維陣列。DataFrame 則是用來處理結構化(Table like)的資料,有列索引與欄標籤的二維資料集,例如關聯式資料庫、CSV 等等。
  3. 透過載入至 Pandas 的資料結構物件後,可以透過結構化物件所提供的方法,來快速地進行資料的前處理,如資料補值,空值去除或取代等。
  4. 更多的輸入來源及輸出整合性,例如:可以從資料庫讀取資料進入 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 為:

Reference
ALL RIGHTS RESERVED. COPYRIGHT © 2016. Designed and Coded by Makee.io