Pandas 讀取資料

Pandas 可以讀取多種格式的資料檔案,包括 CSV、Excel、JSON、SQL 等。讀取後的資料會轉換成 DataFrame。

讀取 CSV 檔案

CSV(Comma-Separated Values)是最常見的資料格式,使用 read_csv() 讀取:

import pandas as pd

df = pd.read_csv('data.csv')
print(df)

常用參數

# 指定分隔符號(預設是逗號)
df = pd.read_csv('data.csv', sep=';')

# 指定編碼(處理中文常用 utf-8 或 big5)
df = pd.read_csv('data.csv', encoding='utf-8')

# 指定哪一欄當作索引
df = pd.read_csv('data.csv', index_col='id')

# 指定要讀取的欄位
df = pd.read_csv('data.csv', usecols=['name', 'age'])

# 跳過前幾列
df = pd.read_csv('data.csv', skiprows=2)

# 只讀取前 n 列
df = pd.read_csv('data.csv', nrows=100)

# 指定缺失值的表示方式
df = pd.read_csv('data.csv', na_values=['NA', 'N/A', ''])

沒有欄位標題的 CSV

# 如果 CSV 沒有標題列
df = pd.read_csv('data.csv', header=None)

# 自訂欄位名稱
df = pd.read_csv('data.csv', header=None, names=['col1', 'col2', 'col3'])

讀取 Excel 檔案

使用 read_excel() 讀取 Excel 檔案:

df = pd.read_excel('data.xlsx')

需要先安裝 openpyxl 套件:

pip install openpyxl

常用參數

# 指定工作表(預設讀取第一個)
df = pd.read_excel('data.xlsx', sheet_name='Sheet2')

# 用索引指定工作表(從 0 開始)
df = pd.read_excel('data.xlsx', sheet_name=0)

# 讀取所有工作表(回傳 dict)
dfs = pd.read_excel('data.xlsx', sheet_name=None)

讀取 JSON 檔案

使用 read_json() 讀取 JSON 檔案:

df = pd.read_json('data.json')

不同 JSON 結構

# 陣列格式的 JSON
# [{"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}]
df = pd.read_json('data.json')

# 物件格式的 JSON
# {"name": {"0": "Alice", "1": "Bob"}, "age": {"0": 25, "1": 30}}
df = pd.read_json('data.json', orient='columns')

從剪貼簿讀取

如果你從 Excel 或網頁複製了表格資料,可以直接讀取:

df = pd.read_clipboard()

從網址讀取

Pandas 可以直接從 URL 讀取資料:

url = 'https://example.com/data.csv'
df = pd.read_csv(url)

讀取 SQL 資料庫

使用 read_sql() 從資料庫讀取:

import sqlite3

# 建立資料庫連線
conn = sqlite3.connect('database.db')

# 執行 SQL 查詢
df = pd.read_sql('SELECT * FROM users', conn)

# 關閉連線
conn.close()

讀取 HTML 表格

從網頁中讀取 <table> 標籤的表格:

# 回傳一個 DataFrame 的 list(網頁中可能有多個表格)
tables = pd.read_html('https://example.com/page.html')
df = tables[0]  # 取第一個表格

需要安裝 lxml 或 html5lib:

pip install lxml

讀取大型檔案

處理大型檔案時,可以分批讀取:

# 分批讀取,每次 1000 列
chunks = pd.read_csv('large_data.csv', chunksize=1000)

for chunk in chunks:
    # 處理每個 chunk
    print(chunk.shape)

常見問題

編碼錯誤

如果遇到編碼錯誤,嘗試不同的編碼:

# 常見編碼
df = pd.read_csv('data.csv', encoding='utf-8')
df = pd.read_csv('data.csv', encoding='big5')      # 繁體中文
df = pd.read_csv('data.csv', encoding='gbk')       # 簡體中文
df = pd.read_csv('data.csv', encoding='latin1')

自動偵測分隔符號

使用 Python 的 csv 模組偵測:

import csv

with open('data.csv', 'r') as f:
    dialect = csv.Sniffer().sniff(f.read(1024))
    
df = pd.read_csv('data.csv', sep=dialect.delimiter)