今天要介紹的是Python用來資料處理的一個工具--Pandas,可以讀取各種檔案轉成表格(csv, excel...)的格式,它也可以快速結合常用的繪圖函式庫,直接畫出漂亮的圖形。在開始之前先來簡單介紹csv格式~
CSV是一個標準的表格形式,很多軟體在儲存與交換表格資料時都支援這樣的格式。它以「逗號(,)」來分隔每個格子、用「換行」來分隔每一筆資料、如果格子裡的資料已經有逗號就會用「雙引號(")」括起來。
假設我現在有一個csv的檔案beverage.csv
,內容如下:
name,ml,price
greentea,750,40
blacktea,750,40
bubbletea,500,60
coffee,450,70
如果要讀取要先import csv,接下來開啟檔案並用reader()讀取出來,它會是好幾個串列,所以用迴圈的方式讀取每一列。
import csv
with open("beverage.csv", "r", newline='') as csvf:
rows = csv.reader(csvf)
for row in rows:
print(row)
結果如下:
['name', 'ml', 'price']
['greentea', '750', '40']
['blacktea', '750', '40']
['bubbletea', '500', '60']
['coffee', '450', '70']
如果你不喜歡list的格式,你也可以把它轉成dict,只要把reader()改成DictReader(),系統會自動把第一行當成欄位名稱,這樣就可以用欄位名稱才存取資料。
import csv
with open("beverage.csv", "r", newline="") as csvf:
rows = csv.DictReader(csvf)
for row in rows:
print(row["name"], ":", row["price"])
結果如下:
greentea : 40
blacktea : 40
bubbletea : 60
coffee : 70
如果在程式中產生了表格的資料,想要儲存為csv檔案,可以用writerow()寫入。若你想寫成dict格式則是用DictWriter()。
import csv
with open("dessert.csv", "w", newline='') as csvf:
d = csv.writer(csvf)
d.writerow(["名稱", "編號", "價格"]) # 寫入第一列當作標題
d.writerow(["布朗尼", "1", "499"])
d.writerow(["波士頓派", "2", "450"])
d.writerow(["草莓慕斯", "3", "580"])
結果如下:
名稱,編號,價格
布朗尼,1,499
波士頓派,2,450
草莓慕斯,3,580
Pandas是用來進行資料處理和資料分析的工具,裡面有兩種結構:Series和DataFrame。Series是一個行多個列或者一個列多個行、DataFrame則是多個行*多個列。
在使用前需要確認已經有安裝 Pandas 套件。
建立Series物件時,傳入list當作參數,就可以把list成功轉成Series。
import pandas as pd
series = pd.Series([40, 40, 60, 70]) # 建立Series物件
print(series)
結果如下:
0 40
1 40
2 60
3 70
dtype: int64
但我不想要前面是0123,我想把索引值改成品項名稱,可以透過index屬性更改。
import pandas as pd
series = pd.Series([40, 40, 60, 70], index=["greentea", "blacktea", "bubbletea", "coffee"]) # 更改index
print(series)
結果如下:
greentea 40
blacktea 40
bubbletea 60
coffee 70
dtype: int64
剛剛有提到DataFrame就是多個行*多個列,其實看起來就像是表格,至於內部的資料樣式就是像字典一樣,有key和value,只是value是list。輸入完資料後用DataFrame()輸出結果。
import pandas as pd
data = { # 傳入資料
"name":["greentea", "blacktea", "bubbletea", "coffee"],
"ml":[750, 750, 500, 450],
"price":[40, 40, 60, 70]
}
menu = pd.DataFrame(data) # 建立DaraFrame物件
print(menu)
結果如下:
name ml price
0 greentea 750 40
1 blacktea 750 40
2 bubbletea 500 60
3 coffee 450 70
跟Series一樣可以自己定義index的名稱,方法也是一樣的,在建立物件時多放一個參數index=[]
,這邊就不做示範了。
除了列印出裡面資料,也可以看到整個資料集的統計數據和資料內容。
import pandas as pd
series = pd.Series([40, 40, 60, 70], index=["greentea", "blacktea", "bubbletea", "coffee"])
data = {
"name":["greentea", "blacktea", "bubbletea", "coffee"],
"ml":[750, 750, 500, 450],
"price":[40, 40, 60, 70]
}
menu = pd.DataFrame(data)
print(menu.info()) # 欄位資料型別等資訊
print("-"*30)
print(menu.describe()) # 統計資訊
print("-"*30)
print(menu.index) # index
print("-"*30)
print(menu.columns) # 列的內容及型態
內容如下:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 name 4 non-null object
1 ml 4 non-null int64
2 price 4 non-null int64
dtypes: int64(2), object(1)
memory usage: 224.0+ bytes
None
------------------------------
ml price
count 4.000000 4.0
mean 612.500000 52.5
std 160.078106 15.0
min 450.000000 40.0
25% 487.500000 40.0
50% 625.000000 50.0
75% 750.000000 62.5
max 750.000000 70.0
------------------------------
RangeIndex(start=0, stop=4, step=1)
------------------------------
Index(['name', 'ml', 'price'], dtype='object')