Pandas 是非常著名的開源數據處理庫,我們可以通過它完成對數據集進行快速讀取、轉換、過濾、分析等一系列操作。除此之外,Pandas 擁有強大的缺失數據處理與數據透視功能,可謂是數據預處理中的必備利器。這是 Pandas 使用教程的第 1 章節,將學會安裝它,並了解 Pandas 的數據結構。
python2.7
Xfce 終端
ipython 終端
本課程難度為一般,屬於初級級別課程,適合具有 Python 基礎,並對使用 Pandas 進行數據處理感興趣的用戶。
學習本課程之前,你可以先自行下載官方文檔(英文)作為輔助學習資料。http://pandas.pydata.org/pandas-docs/stable/pandas.pdf
Pandas 目前支持 Python 2.7, 3.4, 3.5, 和 3.6 版本。最簡單的安裝方式是通過 pip 完成。你可以打開終端,鍵入以下命令。
sudo pip install pandas
安裝過程大約持續 1 分鐘作用,系統會自動下載 numpy 等依賴包。注意,本課程的全部內容基於 Pandas 0.20.3 版本,如果和你當前學習的版本存在不兼容,請通過以下命令安裝 0.20.3 版本。
sudo pip install -v pandas==0.20.3
在正式學習使用 Pandas 進行數據預處理之前,我們先來了解 Pandas 的數據結構。Pandas 大致擁有 3 類數據結構,分別是一維數據 Series、二維數據 DataFrame、以及三維數據 Panel(目前依舊被融入 MultiIndex DataFrame 多維數據)。下面的內容均在 iPython 交互式終端中演示,你可以通過在線環境左下角的應用程式菜單 > 附件打開。如果你在本地進行練習,推薦使用 Jupyter Notebook 環境。
Series 是 Pandas 中最基本的 1 維數據形式。其可以儲存整數、浮點數、字符串等形式的數據。Series 的新建方法如下:
s = pandas.Series(data, index=index)
其中,data 可以是字典、numpy 裡的 ndarray 對象等。index 是數據索引,索引是 pandas 數據結構中的一大特性,它主要的功能是幫助我們更快速地定位數據,這一點後面會談到。
下面,我們將把不同類型的數據轉換為為 Series。首先是字典類型。
import pandas as pd
d = {'a' : 10, 'b' : 20, 'c' : 30}
print pd.Series(d)
這裡,數據值是 10, 20, 30,索引為 a, b, c 。我們可以直接通過 index= 參數來設置新的索引。
import pandas as pd
d = {'a' : 10, 'b' : 20, 'c' : 30}
s = pd.Series(d, index=['b', 'c', 'd', 'a'])
print s
你會發現,pandas 會自動匹配人為設定的索引值和字典轉換過來的索引值。而當索引無對應值時,會顯示為 NaN 缺失值。
ndarray 是著名數值計算包 numpy 中的多維數組。我們也可以將 ndarray 直接轉換為 Series。
import pandas as pd
import numpy as np
data = np.random.randn(5) # 一維隨機數
index = ['a', 'b', 'c', 'd', 'e'] # 指定索引
s = pd.Series(data, index)
print s
上面的兩個例子中,我們都指定了 index 的值。而當我們非人為指定索引值時,Pandas 會默認從 0 開始設置索引值。
s = pd.Series(data)
print s
當我們需要從一維數據 Series 中返回某一個值時,可以直接通過索引完成。
import pandas as pd
import numpy as np
data = np.random.randn(5) # 一維隨機數
index = ['a', 'b', 'c', 'd', 'e'] # 指定索引
s = pd.Series(data, index)
print s
print s['a']
除此之外,Series 是可以直接進行運算的。例如:
import pandas as pd
import numpy as np
data = np.random.randn(5) # 一維隨機數
index = ['a', 'b', 'c', 'd', 'e'] # 指定索引
s = pd.Series(data, index)
print s
print 2*s
print s-s
DataFrame 是 Pandas 中最為常見、最重要且使用頻率最高的數據結構。你可以想到它箱型為電子表格或 SQL 表具有的結構。DataFrame 可以被看成是以 Series 組成的字典。它和 Series 的區別在於,不但具有行索引,且具有列索引。DataFrame 可以用於儲存多種類型的輸入:
一維數組、列表、字典或者 Series 字典。
二維 numpy.ndarray。
結構化的 ndarray。
一個 Series。
另一個 DataFrame。
4.1 Series 字典 -> DataFrameimport pandas as pd
# 帶 Series 的字典
d = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']),'two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d) # 新建 DataFrame
print df
我們可以看到,這裡的行索引為 a, b, c, d ,而列索引為 one, two。
4.2 ndarrays 或 lists 字典 -> DataFrameimport pandas as pd
# 列表構成的字典
d = {'one' : [1, 2, 3, 4], 'two' : [4, 3, 2, 1]}
df1 = pd.DataFrame(d) # 未指定索引
df2 = pd.DataFrame(d, index=['a', 'b', 'c', 'd']) # 指定索引
print df1
print df2
注意觀察它們之間的不同。
import pandas as pd
# 帶字典的列表
d = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(d)
print df
pandas 的 DataFrame 下面還有 4 個以 from_ 開頭的方法,這也可以用來創建 Dataframe。例如:
import pandas as pd
d = [('A', [1, 2, 3]), ('B', [4, 5, 6])]
c = ['one', 'two', 'three']
df = pd.DataFrame.from_items(d, orient='index', columns=c)
print df
接下來,我們延續上面的 4.4 裡面的數據來演示。在一維數據結構 Series 中,我們用 df['標籤'] 來選擇行。而到了二維數據 DataFrame 中,df['標籤'] 表示選擇列了。例如:
刪除列的方法為 df.pop('列索引名'),例如:
添加列的方法未 df.insert(添加列位置索引序號, '添加列名', 數值),例如:
df.insert(3, 'four', [10, 20])
print df