1. 程式人生 > >《Python 數據分析》筆記——pandas

《Python 數據分析》筆記——pandas

filled 處理 追加 默認 date ips 變量 style 標準差

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