目錄
數據創建,讀寫指南
任何數據分析項目的第一步都可能是從某個文件中讀取數據,因此我們需要首先考慮這一點。 在本節中,我們將介紹有關創建pandas Series和DataFrame對象的練習
官方pandas文檔的IO Tools部分提供了有關此主題的全面概述
首先我們來導入pandas庫
import pandas as pd
創建數據 pandas中有兩個核心對象:DataFrame和Series。
DataFrame是一個表。 它包含一系列單獨的條目,每個條目都有一定的值。 每個條目對應一行(或記錄)和一列。
例如,請考慮以下簡單的DataFrame:
pd.DataFrame({'Yes': [50, 21], 'No': [131, 2]})
在此示例中,“0,No”條目的值爲131.“0,Yes”條目的值爲50,依此類推。
DataFrame條目不限於整數。 例如,這是一個DataFrame,其值爲str字符串:
pd.DataFrame({'Bob': ['I liked it.', 'It was awful.'], 'Sue': ['Pretty good.', 'Bland.']})
我們使用pd.DataFrame構造函數來生成這些DataFrame對象。創建新對象的語法是初始化一個字典,其鍵是列名(本例中爲Bob和Sue),其值是條目列表。 這是構建新DataFrame的標準方法,也是你最容易遇到的方法。
字典列表的構造函數爲列標籤分配值,但只使用0(0,1,2,3,...)的遞增計數作爲行標籤。 有時候這沒關係,但我們經常會想要自己分配這些行標籤。
DataFrame中使用的行標籤列表稱爲索引。 我們可以在構造函數中使用索引參數爲其賦值
pd.DataFrame({'Bob': ['I liked it.', 'It was awful.'],
'Sue': ['Pretty good.', 'Bland.']},
index=['Product A', 'Product B'])
相比之下,Series是一系列數據值。 如果DataFrame是表,則Series是列表。 事實上,你可以創建一個Series只有一個列表:
pd.Series([1, 2, 3, 4, 5])
0 1
1 2
2 3
3 4
4 5
dtype: int64
Series本質上是DataFrame的單個列。 因此,你可以使用索引參數以與之前相同的方式爲Series分配列值。 但是,Series沒有列名,它只有一個總名稱:
pd.Series([30, 35, 40], index=['2015 Sales', '2016 Sales', '2017 Sales'], name='Product A')
2015 Sales 30
2016 Sales 35
2017 Sales 40
Name: Product A, dtype: int64
Series和DataFrame密切相關。 將DataFrame視爲實際上只是一堆Series“粘合在一起”是有幫助的。 我們將在本教程的下一部分中看到更多內容。
讀常用文件csv
能夠手動創建DataFrame和Series非常方便。 但是,在大多數情況下,我們實際上不會手動創建自己的數據,我們將使用已經存在的數據。
數據可以以多種不同的形式和格式存儲。 到目前爲止,其中最基本的是簡單的CSV文件。 當你打開CSV文件時,會看到如下所示的內容:
Product A,Product B,Product C,
30,21,9,
35,34,1,
41,11,11
CSV文件是由逗號分隔的表
現在讓我們把我們的玩具數據集放在一邊,看看當我們將它讀入DataFrame時真正的數據集是什麼樣的。
在這個案例裏,我們將查看澳大利亞墨爾本的房價數據。點擊這裏 下載 數據集
我們將使用read_csv函數將數據讀入DataFrame。 這樣做:
melbourne_data = pd.read_csv('melb_data.csv')
我們可以使用shape屬性來檢查生成的DataFrame的大小:
melbourne_data.shape
(13580, 21)
因此,我們的新DataFrame有1萬3千多條記錄,分爲21個不同的列。
我們可以使用head命令檢查結果DataFrame的內容,該命令抓取前五行:
melbourne_data.head()
pandas read_csv函數功能豐富,可以指定30多個可選參數。 例如,你可以在創建數據集時候使用csv文件某列作爲內置索引,而pandas默認不會自動獲取。 爲了使pandas將該列用於索引(而不是從頭開始創建新索引),我們可以指定並使用index_col。
melbourne_data = pd.read_csv('melb_data.csv', index_col=0)
melbourne_data.head()
讀常用文件excel
讓我們看看你可能會遇到的更多數據類型。
首先是古老的Excel電子表格。 Excel文件(XLS或XLST)將自身組織爲一系列命名工作表。 每張Sheet基本上都是一張表格。 因此,要將數據加載到pandas中,我們需要一個額外的參數:感興趣的工作表的名稱。
點擊這裏 下載 數據集
本地打開如下
用pandas的read_excel讀取:
wic = pd.read_excel("WICAgencies2013ytd.xls",
sheet_name='Total Women')
wic.head()
正如你在此示例中所看到的,Excel文件通常不像CSV文件那樣格式化。電子表格允許(並鼓勵)創建人類可讀但不是機器可讀的註釋和字段。
所以在我們使用這個特定的數據集之前,我們需要稍微清理一下。我們將在下一節中看到如何執行此操作。
讀常用文件sqlite
現在,讓我們轉到另一種常見的數據格式:sqlite。
點擊這裏 下載 sqlite數據集
連接到SQL數據庫需要比從Excel文件讀取更多的思考。首先,你需要創建一個連接器
pandas不會自動爲你執行此操作,因爲有許多不同類型的SQL數據庫,每個都有自己的連接器。因此,對於SQLite數據庫,你需要首先執行以下操作(使用Python附帶的sqlite3庫):
import sqlite3
conn = sqlite3.connect("Salaries.sqlite")
你需要做的另一件事是編寫SQL語句。 在內部,SQL數據庫的運行方式完全不同。 但是,在外部,它們都提供相同的API,即“結構化查詢語言”(或簡稱SQL ...)。
所以,不用多說,以下是從SQLite中查看數據庫裏有多少表格
tables = pd.read_sql_query("SELECT * FROM sqlite_master where type='table'", conn)
tables
salaries = pd.read_sql_query("SELECT * FROM Salaries", conn)
conn.close()
salaries.head()
如何寫入常用文件
將數據寫入文件通常比從一個文件中讀取數據更容易,因爲pandas會爲你處理轉換的麻煩。
我們將再次使用CSV文件。 read_csv(讀取我們的數據)的反義詞是to_csv,寫入它。 使用CSV文件很簡單:
melbourne_data.head().to_csv('melb_data_head.csv')
要寫回Excel文件,需要再次使用to_excel和sheet_name:
wic.head().to_excel('wic_head.xls', sheet_name='Total Women')
最後,要寫入到SQLite數據庫,我們要將數據輸入的數據庫中提供表的名稱,以及連接器:
conn = sqlite3.connect("salaries_head.sqlite")
salaries.head().to_sql("salaries", conn)
conn.close()
無痛完成讀寫!