基於 Python 和 Pandas 的數據分析(3) --- 輸入/輸出 基礎
這一節, 我們要討論 Pandas 的輸入與輸出, 並且應用在現實的實際例子中. 為了得到大量的數據, 向大家推薦一個網站 Quandl. Quandl 有很多免費和付費的資源. 這個網站最大的優勢在於數據的規範化, 集中性以及提取數據的方式都是一樣的. 如果你獲取數據的時候, 選擇用 Python, 那麽數據會自動轉成 dataframe. 但是, 我們這節課的目的是理解 Pandas 的輸入與輸出, 所以我們還是手動下載一個 CSV 文件.
舉個例子, 我們想要買賣德克薩斯州的一處房產. 那裏的郵政編碼是 77006. 我們可以去查看當地的房產清單, 並且可以了解到現在的市場價, 但是我們卻得不到歷史信息. 但是我們可以在 Quandl 得到這方面的信息. 我們可以查尋 "home value index 77006". 我們可以得到一系列的結果, 有高, 中, 低檔, 還有三室的等等. 加入我們想要一個三居室的房子. 我們選中一個, 然後點進去看一下. 事實上, Quandl 已經提供了圖表數據, 但是出於學習的目的, 我們還是獲取其數據集, 自己制作圖表, 以及其他的一些數據分析. 選擇 CSV 格式並下載. Pandas 支持 csv, excel, hdf, sql, json, msgpack, html, gbg, stata, clipboard, pickle data 等格式的輸入輸出. 把下載好的 csv 文件放在與你在操作的 python 腳本文件的文件夾裏.
下面開始處理這個 csv 文件, 首先是導入並轉成 dataframe:
import pandas as pd
df = pd.read_csv(‘ZILL-Z77006_3B.csv‘)
print(df.head())
輸出:
Date Value
0 2018-11-30 48.3
1 2018-10-31 48.1
2 2018-09-30 48.3
3 2018-08-31 49.4
4 2018-07-31 49.2
通過這個輸出, 我們發現, 我們需要設置一個合適的索引:
df.set_index(‘Date‘, inplace = True)
輸出:
Value
Date
2018-11-30 48.3
2018-10-31 48.1
2018-09-30 48.3
2018-08-31 49.4
2018-07-31 49.2
現在, 我們又想把這個 dataframe 輸出成 csv 文件呢?
df.to_csv(‘newCsv.csv‘)
好了, 現在查看一下你的項目文件夾, 看看是否多了一個 newCsv.csv 文件? 理論上, 應該是有的. 可以打開看一下這個文件, 大概長這個樣子:
目前我們這個例子是只有一個 value 列, 但是如果你的數據裏有很多的列, 然而, 你只想將其中的某一列輸出到 csv 文件, 可以這樣做:
df[‘Value‘].to_csv(‘newCsv2.csv‘)
生成的 csv 文件大概長這樣:
由於在之前我們把 "Date" 設置成了索引列, 所以日期列作為索引列也一並輸出了, 但是與之前去別的是沒有表頭了. 這裏大家可以自己嘗試一下, 不要"Date"列做索引, 那麽就不會輸出日期這一列, 但是同樣會輸出一列自增數字.
下面, 我們再來讀入第一個生成的 csv 文件:
df = pd.read_csv(‘newCsv.csv‘)
print(df.head())
輸出:
Date Value
0 2018-11-30 48.3
1 2018-10-31 48.1
2 2018-09-30 48.3
3 2018-08-31 49.4
4 2018-07-31 49.2
見鬼, 我們定義的索引又沒有了. 這是因為 CSV 文件並沒有"索引"屬性. 為了解決這個問題, 我們可以在讀取的時候同時設置索引, 而不是讀取之後再設置索引:
df = pd.read_csv(‘newCsv.csv‘, index_col=0)
print(df.head())
Output:
Value
Date
2015-06-30 502300
2015-05-31 501500
2015-04-30 500100
2015-03-31 495800
2015-02-28 492700
這裏 index_col = 0 的意思就是把第0列設置為索引列.
還有一個問題, 就是 "Value" 這個列名其實是沒有什麽實際意義的, 我們需要給它一個具有實際意義的名字, 有很多方法可以更改列名, 下面介紹其中一種:
df.columns = [‘Austin_HPI‘]
print(df.head())
輸出:
Austin_HPI
Date
2018-11-30 48.3
2018-10-31 48.1
2018-09-30 48.3
2018-08-31 49.4
2018-07-31 49.2
接下來, 我們再把這個 dataframe 保存成一個新的 csv 文件:
df.to_csv(‘newcsv3.csv‘)
打開文件看下, 大概長這樣:
我們看到新生成文件帶上了表頭, 那麽如果你不想要這個表頭, 要怎麽做呢?
df.to_csv(‘newcsv4.csv‘, header=False)
這樣保存的 newcsv4.csv 文件就沒有表頭了, 那麽當我們再想讀入這個文件的時候, 自然就也是沒有表頭的了, 那麽要怎麽在讀取文件的同時加上表頭呢? 可以這樣操作:
df = pd.read_csv(‘newcsv4.csv‘, names = [‘Date‘,‘House_Price‘], index_col=0)
print(df.head())
輸出:
Austin_HPI
Date
2018-11-30 48.3
2018-10-31 48.1
2018-09-30 48.3
2018-08-31 49.4
2018-07-31 49.2
以上就是一些基本的輸入/輸出操作.
正如我們前面所說的, Pandas 支持各種格式的輸入/輸出. 下面我們來嘗試一下以 html 的格式輸出 df 文件:
df.to_html(‘example.html‘)
這其實就是 html 的表格, 大家可以查看源碼看一下. 生成的 example.html 大概長這樣:
有一點要註意的是: 這個表格被自動賦予了 "dataframe" 類, 也就是說你還可以對其自定義其他 CSS 樣式.
當我需要 SQL 輸出的時候, 我特別喜歡使用 Pandas. 我會把數據庫裏的所有數據都轉成 dataframe 格式, 然後做需要的計算, 再以我想要的格式輸出.
最後, 介紹一下如果你想改變某一列的列名, 該怎麽做呢:
df = pd.read_csv(‘newcsv4.csv‘, names=[‘Date‘, ‘Austin_HPI‘])
print(df.head())
df.rename(columns={‘Austin_HPI‘: ‘77006_HPI‘}, inplace=True)
print(df.head())
輸出:
Date Austin_HPI
0 2018-11-30 48.3
1 2018-10-31 48.1
2 2018-09-30 48.3
3 2018-08-31 49.4
4 2018-07-31 49.2
Date 77006_HPI
0 2018-11-30 48.3
1 2018-10-31 48.1
2 2018-09-30 48.3
3 2018-08-31 49.4
4 2018-07-31 49.2
這裏呢, 我們首先讀入文件, 並且分別給字段命名為 "Date" 和 "Austin_HPI". 然後, 我們決定不叫 "Austin_HPI", 而要改為 "77006_HPI". 所以, 我們使用 df.rename() 函數, 指定我們我想改變的列的名字. 記住這裏別忘了加上 "inplace=True" 來確保對原對象做了更改, 而不是生成一個新對象.
基於 Python 和 Pandas 的數據分析(3) --- 輸入/輸出 基礎