iT邦幫忙

2022 iThome 鐵人賽

DAY 25
0
AI & Data

30天帶你從零基礎到Python爬蟲系列 第 25

[Day25] Pandas基本使用

  • 分享至 

  • xImage
  •  

今天要介紹的是Python用來資料處理的一個工具--Pandas,可以讀取各種檔案轉成表格(csv, excel...)的格式,它也可以快速結合常用的繪圖函式庫,直接畫出漂亮的圖形。在開始之前先來簡單介紹csv格式~

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 套件

Pandas是用來進行資料處理和資料分析的工具,裡面有兩種結構:Series和DataFrame。Series是一個行多個列或者一個列多個行、DataFrame則是多個行*多個列。

在使用前需要確認已經有安裝 Pandas 套件。
https://ithelp.ithome.com.tw/upload/images/20220918/20140998I47MbWDSl7.png

Series

建立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

剛剛有提到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')

上一篇
[Day24] 爬蟲實戰演練 - 奇摩電影
下一篇
[Day26] Pandas實戰演練 - 政府開放資料
系列文
30天帶你從零基礎到Python爬蟲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言