《Python 數據分析》筆記——pandas
Pandas
pandas是一個流行的開源Python項目,其名稱取panel data(面板數據)與Python data analysis(Python 數據分析)之意。
pandas有兩個重要的數據結構:DataFrame和Series
pandas數據結構之DataFrame
pandas的DataFrame數據結構是一種帶標簽的二維對象,與Excel的電子表格或者關系型數據表非常相似。
可以用下列方式來創建DataFrame:
1.從另一個DataFrame創建DataFrame
2.從具有二維形狀的Numpy數組或者數組的復合結構來生成DataFrame
3.類似地,可以用pandas的另一種數據結構Series來創建DataFrame.關於Series,後文介紹
4.DataFrame也可以從類似CSV之類的文件來生成
考察pandas的DataFrame及其各種屬性
(1)首先,將數據文件載入DataFrame,並顯示其內容:
from pandas.io.parsers import read_csv df=read_csv("WHO_first9cols.csv") print("Dataframe",df)
(2)DataFrame有一個屬性,以元組的形式來存放DataFrame的形狀數據,這與ndarray非常相似,我們可以查詢一個DataFrame的行數
print("shape",df.shape) print("Length",len(df))
(3)下面通過其他屬性來考察各列的標題與數據類型
print("Column Headers",df.columns) print("Data types",df.dtypes)
(4)pandas的DataFrame帶有一個索引,類似於關系型數據庫中數據表的主鍵(primary key)。對於這個索引,我們既可以手動規定,也可以讓pandas自動創建。訪問索引時,使用相應的屬性即可
print("Index",df.index)
(5)有時我們希望遍歷DataFrame的基礎數據,如果使用pandas的叠代器,遍歷列值的效率可能會很低。更好的解決方案是從基礎的Numpy數組中提取這些數值,然後進行相應的處理。不過,pandas的DataFrame的某一個屬性可以在這方面為我們提供幫助
print("Values",df.values)
Pandas數據結構之Series
pandas的Series數據結構是由不同類型的元素組成的一維數組,該數據結構也具有標簽。可以通過下列方式來創建pandas的Series數據結構。
1.由Python的字典來創建Series
2.由Numpy數組來創建Series
3.由單個標量來創建
創建Series數據結構時,可以向構造函數遞交一組軸標簽,這些標簽通常稱為索引,是一個可選參數。默認情況下,如果使用Numpy數組作為輸入數據,那麽pandas會將索引值從0開始遞增。如果傳遞給構造函數的數據是一個Python字典,那麽這個字典的鍵會經排序後變成相應的索引;如果輸入數據是一個標量值,那麽就需要由我們來提供相應的索引。索引中的每一個新值都要輸入一個標量值。pandas的Series和DataFrame數據類型接口的特征和行為是從Numpy數組和Python字典那裏借用來的
(1)首先,選中輸入文件中的第一列,即Country列;然後顯示這個對象在局部作用域中的類型
country_col=df["Country"] print("Type df",type(df)) print("Type country col",type(country_col))
(2)pandas的Series數據結構不僅共享了DataFrame的一些屬性,還另外提供了與名稱有關的一個屬性。
print("Series shape",country_col.shape) print("Series index",country_col.index) print("Series values”,country_col.values) print("Series name",country_col.name)
(3)為了演示Series的切片功能,這裏以截取Series變量Country中的最後兩個國家為例進行說明
print("Last 2 countries",country_col[-2:]) print("Last 2 countries type",type(country_col[-2:]))
(4)Numpy的函數同樣適用於pandas的DataFrame和Series數據結構
可以在DataFrame、Series和Numpy數組之間進行各種類型的數值運算。
利用pandas查詢數據:
(1)head()和tail()這兩個函數的作用類似於UNIX系統中同名的兩個命令,即選取DataFrame的前n和後n個數據記錄,其中n是一個整型參數:
print("Head 2",sunspots.head(2)) print("Tail 2",sunspots.tail(2))
(3)下面用最近的日期來查詢最近一年太陽黑子的相關數據:
last_data=sunspots.index[-1] print("Last value",sunspots.loc[last_date])
(4)下面介紹如何通過YYYYMMDD格式的日期字符串來查詢日期,具體如下所示:
print(“Values slice by date”,sunspots[“20020101”:”20131231”])
(5)索引列表也可用於查詢
print("Slice from a list of indices",sunspots.iloc[[2,4,-4,2]])
(6)要想選擇標量值,有兩種方法,這裏給出的是速度明顯占優勢的第二種方法。它們需要兩個整數作為參數,其中第一個整數表示行,第二個整數表示列:
print("Scalar with Iloc",sunspots.iloc[0,0]) print("Scalar with iat",sunspots.iat[1,0])
(7)查詢布爾型變量的方法與SQL的Where子句非常接近
print("Boolean selection",sunspots[sunspots>sunspots.mean()])
利用pandas的DataFrame進行統計計算
pandas的DataFrame數據結構為我們提供了若幹統計函數。
describe:這個方法將返回描述性統計信息
count:這個方法將返回非NaN數據項的數量
mad:這個方法用於計算平均絕對偏差,即類似於標準差的一個有力統計工具
median:這個方法用於返回中位數
min:這個方法將返回最小值
max:這個方法將返回最大值
mode:這個方法將返回眾數
std:這個方法將返回標準差
var:這個方法將返回方差
skew:這個方法用來返回偏態系數,該系數表示的是數據分布的對稱程度
kurt:這個方法將返回峰態系數,該系數用來反映數據分布曲線頂端尖峭或扁平程度
利用pandas的DataFrame實現數據聚合
(1)為Numpy的隨機數生成器指定種子,以確保重復運行程序時生成的數據不會走樣
import pandas as pd from numpy.random import seed from numpy.random import rand from numpy.random import random_integers import numpy as np seed(42) df=pd.DataFrame({‘Weather‘:[‘cold‘,‘hot‘,‘cold‘,‘hot‘,‘cold‘,‘hot‘,‘cold‘],‘Food‘:[‘soup‘,‘soup‘,‘icecream‘,‘chocolate‘,‘icecream‘,‘icecream‘,‘soup‘],‘Price‘:10*rand(7),‘Number‘:random_integers(1,9,size=(7,))}) print(df)
(2)通過Weather 列為數據分組,然後遍歷各組數據
weather_group=df.groupby(‘Weather‘) i=0 for name,group in weather_group: i=i+1 print("Group",i,name) print(group)
(3)變量Weather_group是一種特殊的pandas對象,可由groupby()生成。這個對象為我們提供了聚合函數,下面展示它的使用方法:
print("Weather group first",weather_group.first()) print("Weather_group last",weather_group.last()) print("Weather_group mean",weather_group.mean())
(4)恰如利用數據庫的查詢操作那樣,也可以針對多列進行分組
(5)通過agg()方法,可以對數據組施加一系列的Numpy函數
print("WF Aggregrated\n",weather_group.agg([np.mean,np.median]))
DataFrame的串聯與附加操作
數據庫的數據表有內部連接和外部連接兩種連接操作類型。實際上,pandas的DataFrame也有類似的操作,因此我們也可以對數據行進行串聯和附加。我們將使用前面章節中的DataFrame來練習數據行的串聯和附加操作
函數concat()的作用是串聯DataFrame,如可以把一個由3行數據組成的DataFrame與其他數據行串接,以便重建原DataFrame:
print("Concat Back together\n",pd.concat([df[:3],df[3:]]))
為了追加數據行,可以使用append()函數:
print("Appending rows\n",df[:3].append(df[5:]))
連接DataFrames
pandas提供的merge()函數或DataFrame的join()實例方法都能實現類似數據庫的連接操作功能。默認情況下,join()實例方法會按照索引進行連接,不過,有時不符合我們的要求
雖然,pandas支持所有的這些連接類型(內部連接、左外連接、右外連接與完全外部連接等操作)
(1)用merge()函數按照員工編號進行連接處理
print("Merge() on key\n",pd.merge(dests,tips,on=‘EmpNr‘))
(2)用join()方法執行連接操作時,需要使用後綴來指示左操作對象和右操作對象:
print("Dests join() tips\n",dests.join(tips,lsuffix=‘Dest‘,rsuffix=‘Tips‘))
這個方法會連接索引值,因此得到的結果與SQL內部連接會有所不同
(3)用merge()執行內部連接時,更顯式的方法如下所示:
print("Inner join with merge()\n",pd.merge(dests,tips,how=‘inner‘))
只要稍作修改,就可以變成完全外部連接:
print("Outer join\n",pd.merge(dests,tips,how=‘outer‘))
處理缺失數據問題
對於pandas來說,它會把缺失的數值標為NaN,表示None;還有一個類似的符號是NaT,不過它代表的是datetime64型對象。對NaN這個數值進行算數運算時,得到的結果還是NaN。
pandas的isnull()函數可以幫我們檢查缺失的數據,使用方法如下。
print("Null values\n",pd.isnull(df))
類似地,可以用DataFrame的notnull()方法來考察非缺失數據:
print("Not Null Values\n",df.notnull())
通過fillna()方法,可以用一個標量(如0)來替換缺失數據,盡管有時可以用0替換缺失數據,但是事情並不總是如此
print("zero filled\n",df.fillna(0))
數據透視表
數據透視表可以從一個平面文件中指定的行和列中聚合數據,這種聚合操作可以是求和、求平均值、求標準差等運算
由於pandas API已經為我們提供了頂級pivot_table()函數以及相應的DataFrame方法,所以,只要設置好aggfunc參數,就可以讓這個聚合函數來執行Numpy中諸如sum()之類的函數。參數cols用來告訴pandas要對哪些列進行聚合運算。
print(pd.pivot_table(df,cols=[‘Food‘],aggfunc=np.sum))
《Python 數據分析》筆記——pandas