(轉(zhuǎn))https://www.cnblogs.com/nxld/p/6058591.html
Python數(shù)據(jù)分析之pandas學習
Python中的pandas模塊進行數(shù)據(jù)分析囚企。
接下來pandas介紹中將學習到如下8塊內(nèi)容:
1栽燕、數(shù)據(jù)結(jié)構(gòu)簡介:DataFrame和Series
2奸腺、數(shù)據(jù)索引index
3、利用pandas查詢數(shù)據(jù)
4漫仆、利用pandas的DataFrames進行統(tǒng)計分析
5疲恢、利用pandas實現(xiàn)SQL操作
6爹袁、利用pandas進行缺失值的處理
7苹祟、利用pandas實現(xiàn)Excel的數(shù)據(jù)透視表功能
8、多層索引的使用
一亚铁、數(shù)據(jù)結(jié)構(gòu)介紹
在pandas中有兩類非常重要的數(shù)據(jù)結(jié)構(gòu)蝇刀,即序列Series和數(shù)據(jù)框DataFrame。Series類似于numpy中的一維數(shù)組徘溢,除了通吃一維數(shù)組可用的函數(shù)或方法吞琐,而且其可通過索引標簽的方式獲取數(shù)據(jù)捆探,還具有索引的自動對齊功能;DataFrame類似于numpy中的二維數(shù)組站粟,同樣可以通用numpy數(shù)組的函數(shù)和方法黍图,而且還具有其他靈活應用,后續(xù)會介紹到奴烙。
1助被、Series的創(chuàng)建
序列的創(chuàng)建主要有三種方式:
1)通過一維數(shù)組創(chuàng)建序列
import numpy as np, pandas as pd
arr1 = np.arange(10)
arr1
type(arr1)
s1 = pd.Series(arr1)
s1
type(s1)
2)通過字典的方式創(chuàng)建序列
dic1 = {'a':10,'b':20,'c':30,'d':40,'e':50}
dic1
type(dic1)
s2 = pd.Series(dic1)
s2
type(s2)
3)通過DataFrame中的某一行或某一列創(chuàng)建序列
這部分內(nèi)容我們放在后面講,因為下面就開始將DataFrame的創(chuàng)建切诀。
2揩环、DataFrame的創(chuàng)建
數(shù)據(jù)框的創(chuàng)建主要有三種方式:
1)通過二維數(shù)組創(chuàng)建數(shù)據(jù)框
arr2 = np.array(np.arange(12)).reshape(4,3)
arr2
type(arr2)
df1 = pd.DataFrame(arr2)
df1
type(df1)
2)通過字典的方式創(chuàng)建數(shù)據(jù)框
以下以兩種字典來創(chuàng)建數(shù)據(jù)框,一個是字典列表幅虑,一個是嵌套字典丰滑。
dic2 = {'a':[1,2,3,4],'b':[5,6,7,8],
'c':[9,10,11,12],'d':[13,14,15,16]}
dic2
type(dic2)
df2 = pd.DataFrame(dic2)
df2
type(df2)
dic3 = {'one':{'a':1,'b':2,'c':3,'d':4},
'two':{'a':5,'b':6,'c':7,'d':8},
'three':{'a':9,'b':10,'c':11,'d':12}}
dic3
type(dic3)
df3 = pd.DataFrame(dic3)
df3
type(df3)
3)通過數(shù)據(jù)框的方式創(chuàng)建數(shù)據(jù)框
df4 = df3[['one','three']]
df4
type(df4)
s3 = df3['one']
s3
type(s3)
二、數(shù)據(jù)索引index
細致的朋友可能會發(fā)現(xiàn)一個現(xiàn)象倒庵,不論是序列也好褒墨,還是數(shù)據(jù)框也好,對象的最左邊總有一個非原始數(shù)據(jù)對象擎宝,這個是什么呢郁妈?不錯,就是我們接下來要介紹的索引认臊。
在我看來,序列或數(shù)據(jù)框的索引有兩大用處锄奢,一個是通過索引值或索引標簽獲取目標數(shù)據(jù)失晴,另一個是通過索引,可以使序列或數(shù)據(jù)框的計算拘央、操作實現(xiàn)自動化對齊涂屁,下面我們就來看看這兩個功能的應用。
1灰伟、通過索引值或索引標簽獲取數(shù)據(jù)
s4 = pd.Series(np.array([1,1,2,3,5,8]))
s4
如果不給序列一個指定的索引值拆又,則序列自動生成一個從0開始的自增索引±刚耍可以通過index查看序列的索引:
s4.index
現(xiàn)在我們?yōu)樾蛄性O(shè)定一個自定義的索引值:
s4.index = ['a','b','c','d','e','f']
s4
序列有了索引帖族,就可以通過索引值或索引標簽進行數(shù)據(jù)的獲取:
s4[3]
s4['e']
s4[[1,3,5]]
s4[['a','b','d','f']]
s4[:4]
s4['c':]
s4['b':'e']
千萬注意:如果通過索引標簽獲取數(shù)據(jù)的話挡爵,末端標簽所對應的值是可以返回的竖般!在一維數(shù)組中,就無法通過索引標簽獲取數(shù)據(jù)茶鹃,這也是序列不同于一維數(shù)組的一個方面涣雕。
2艰亮、自動化對齊
如果有兩個序列,需要對這兩個序列進行算術(shù)運算挣郭,這時索引的存在就體現(xiàn)的它的價值了—自動化對齊.
s5 = pd.Series(np.array([10,15,20,30,55,80]),
index = ['a','b','c','d','e','f'])
s5
s6 = pd.Series(np.array([12,11,13,15,14,16]),
index = ['a','c','g','b','d','f'])
s6
s5 + s6
s5/s6
由于s5中沒有對應的g索引迄埃,s6中沒有對應的e索引,所以數(shù)據(jù)的運算會產(chǎn)生兩個缺失值NaN兑障。注意侄非,這里的算術(shù)結(jié)果就實現(xiàn)了兩個序列索引的自動對齊,而非簡單的將兩個序列加總或相除旺垒。對于數(shù)據(jù)框的對齊彩库,不僅僅是行索引的自動對齊,同時也會自動對齊列索引(變量名)
數(shù)據(jù)框中同樣有索引先蒋,而且數(shù)據(jù)框是二維數(shù)組的推廣骇钦,所以其不僅有行索引,而且還存在列索引竞漾,關(guān)于數(shù)據(jù)框中的索引相比于序列的應用要強大的多眯搭,這部分內(nèi)容將放在數(shù)據(jù)查詢中講解。
三业岁、利用pandas查詢數(shù)據(jù)
這里的查詢數(shù)據(jù)相當于R語言里的subset功能鳞仙,可以通過布爾索引有針對的選取原數(shù)據(jù)的子集、指定行笔时、指定列等棍好。我們先導入一個student數(shù)據(jù)集:
student = pd.io.parsers.read_csv('C:\\Users\\admin\\Desktop\\student.csv')
查詢數(shù)據(jù)的前5行或末尾5行
student.head()
student.tail()
查詢指定的行
student.ix[[0,2,4,5,7]] #這里的ix索引標簽函數(shù)必須是中括號[]
查詢指定的列
student[['Name','Height','Weight']].head() #如果多個列的話,必須使用雙重中括號
也可以通過ix索引標簽查詢指定的列
student.ix[:,['Name','Height','Weight']].head()
查詢指定的行和列
student.ix[[0,2,4,5,7],['Name','Height','Weight']].head()
以上是從行或列的角度查詢數(shù)據(jù)的子集允耿,現(xiàn)在我們來看看如何通過布爾索引實現(xiàn)數(shù)據(jù)的子集查詢借笙。
查詢所有女生的信息
student[student['Sex']=='F']
查詢出所有12歲以上的女生信息
student[(student['Sex']=='F') & (student['Age']>12)]
查詢出所有12歲以上的女生姓名、身高和體重
student[(student['Sex']=='F') & (student['Age']>12)][['Name','Height','Weight']]
上面的查詢邏輯其實非常的簡單较锡,需要注意的是业稼,如果是多個條件的查詢,必須在&(且)或者|(或)的兩端條件用括號括起來蚂蕴。
四低散、統(tǒng)計分析
pandas模塊為我們提供了非常多的描述性統(tǒng)計分析的指標函數(shù),如總和骡楼、均值熔号、最小值、最大值等鸟整,我們來具體看看這些函數(shù):
首先隨機生成三組數(shù)據(jù)
np.random.seed(1234)
d1 = pd.Series(2*np.random.normal(size = 100)+3)
d2 = np.random.f(2,4,size = 100)
d3 = np.random.randint(1,100,size = 100)
d1.count() #非空元素計算
d1.min() #最小值
d1.max() #最大值
d1.idxmin() #最小值的位置跨嘉,類似于R中的which.min函數(shù)
d1.idxmax() #最大值的位置,類似于R中的which.max函數(shù)
d1.quantile(0.1) #10%分位數(shù)
d1.sum() #求和
d1.mean() #均值
d1.median() #中位數(shù)
d1.mode() #眾數(shù)
d1.var() #方差
d1.std() #標準差
d1.mad() #平均絕對偏差
d1.skew() #偏度
d1.kurt() #峰度
d1.describe() #一次性輸出多個描述性統(tǒng)計指標
必須注意的是,descirbe方法只能針對序列或數(shù)據(jù)框祠乃,一維數(shù)組是沒有這個方法的
這里自定義一個函數(shù)梦重,將這些統(tǒng)計描述指標全部匯總到一起:
def stats(x):
return pd.Series([x.count(),x.min(),x.idxmin(),
x.quantile(.25),x.median(),
x.quantile(.75),x.mean(),
x.max(),x.idxmax(),
x.mad(),x.var(),
x.std(),x.skew(),x.kurt()],
index = ['Count','Min','Whicn_Min',
'Q1','Median','Q3','Mean',
'Max','Which_Max','Mad',
'Var','Std','Skew','Kurt'])
stats(d1)
在實際的工作中,我們可能需要處理的是一系列的數(shù)值型數(shù)據(jù)框亮瓷,如何將這個函數(shù)應用到數(shù)據(jù)框中的每一列呢琴拧?可以使用apply函數(shù),這個非常類似于R中的apply的應用方法嘱支。
將之前創(chuàng)建的d1,d2,d3數(shù)據(jù)構(gòu)建數(shù)據(jù)框:
df = pd.DataFrame(np.array([d1,d2,d3]).T,columns=['x1','x2','x3'])
df.head()
df.apply(stats)
非常完美蚓胸,就這樣很簡單的創(chuàng)建了數(shù)值型數(shù)據(jù)的統(tǒng)計性描述。如果是離散型數(shù)據(jù)呢除师?就不能用這個統(tǒng)計口徑了沛膳,我們需要統(tǒng)計離散變量的觀測數(shù)、唯一值個數(shù)汛聚、眾數(shù)水平及個數(shù)锹安。你只需要使用describe方法就可以實現(xiàn)這樣的統(tǒng)計了。
student['Sex'].describe()
除以上的簡單描述性統(tǒng)計之外倚舀,還提供了連續(xù)變量的相關(guān)系數(shù)(corr)和協(xié)方差矩陣(cov)的求解叹哭,這個跟R語言是一致的用法。
df.corr()
關(guān)于相關(guān)系數(shù)的計算可以調(diào)用pearson方法或kendell方法或spearman方法痕貌,默認使用pearson方法风罩。
df.corr('spearman')
如果只想關(guān)注某一個變量與其余變量的相關(guān)系數(shù)的話,可以使用corrwith,如下方只關(guān)心x1與其余變量的相關(guān)系數(shù):
df.corrwith(df['x1'])
數(shù)值型變量間的協(xié)方差矩陣
-
df.cov()
五舵稠、類似于SQL的操作
在SQL中常見的操作主要是增超升、刪、改哺徊、查幾個動作室琢,那么pandas能否實現(xiàn)對數(shù)據(jù)的這幾項操作呢?答案是Of Course!
增:添加新行或增加新列
In [99]: dic = {'Name':['LiuShunxiang','Zhangshan'],
...: 'Sex':['M','F'],'Age':[27,23],
...: 'Height':[165.7,167.2],'Weight':[61,63]}
In [100]: student2 = pd.DataFrame(dic)
In [101]: student2
Out[101]:
Age Height Name Sex Weight
0 27 165.7 LiuShunxiang M 61
1 23 167.2 Zhangshan F 63
現(xiàn)在將student2中的數(shù)據(jù)新增到student中唉工,可以通過concat函數(shù)實現(xiàn):
注意到了嗎研乒?在數(shù)據(jù)庫中union必須要求兩張表的列順序一致汹忠,而這里concat函數(shù)可以自動對齊兩個數(shù)據(jù)框的變量淋硝!
新增列的話,其實在pandas中就更簡單了宽菜,例如在student2中新增一列學生成績:
對于新增的列沒有賦值谣膳,就會出現(xiàn)空NaN的形式。
刪:刪除表铅乡、觀測行或變量列
刪除數(shù)據(jù)框student2,通過del命令實現(xiàn)继谚,該命令可以刪除Python的所有對象。
刪除指定的行
原數(shù)據(jù)中的第1,2,4,7行的數(shù)據(jù)已經(jīng)被刪除了阵幸。
根據(jù)布爾索引刪除行數(shù)據(jù)花履,其實這個刪除就是保留刪除條件的反面數(shù)據(jù)芽世,例如刪除所有14歲以下的學生:
刪除指定的列
我們發(fā)現(xiàn),不論是刪除行還是刪除列诡壁,都可以通過drop方法實現(xiàn)济瓢,只需要設(shè)定好刪除的軸即可,即調(diào)整drop方法中的axis參數(shù)妹卿。默認該參數(shù)為0旺矾,表示刪除行觀測,如果需要刪除列變量夺克,則需設(shè)置為1箕宙。
改:修改原始記錄的值
如果發(fā)現(xiàn)表中的某些數(shù)據(jù)錯誤了,如何更改原來的值呢铺纽?我們試試結(jié)合布爾索引和賦值的方法:
例如發(fā)現(xiàn)student3中姓名為Liushunxiang的學生身高錯了柬帕,應該是173,如何改呢室囊?
這樣就可以把原來的身高修改為現(xiàn)在的170了雕崩。
看,關(guān)于索引的操作非常靈活融撞、方便吧盼铁,就這樣輕松搞定數(shù)據(jù)的更改。查:有關(guān)數(shù)據(jù)查詢部分尝偎,上面已經(jīng)介紹過饶火,下面重點講講聚合、排序和多表連接操作致扯。
聚合:pandas模塊中可以通過groupby()函數(shù)實現(xiàn)數(shù)據(jù)的聚合操作
根據(jù)性別分組肤寝,計算各組別中學生身高和體重的平均值:
如果不對原始數(shù)據(jù)作限制的話,聚合函數(shù)會自動選擇數(shù)值型數(shù)據(jù)進行聚合計算抖僵。如果不想對年齡計算平均值的話鲤看,就需要剔除改變量:
groupby還可以使用多個分組變量,例如根本年齡和性別分組耍群,計算身高與體重的平均值:
當然义桂,還可以對每個分組計算多個統(tǒng)計量:
是不是很簡單,只需一句就能完成SQL中的SELECT…FROM…GROUP BY…功能蹈垢,何樂而不為呢慷吊?
排序:
排序在日常的統(tǒng)計分析中還是比較常見的操作,我們可以使用order曹抬、sort_index和sort_values實現(xiàn)序列和數(shù)據(jù)框的排序工作:
我們再試試降序排序的設(shè)置:
上面兩個結(jié)果其實都是按值排序溉瓶,并且結(jié)果中都給出了警告信息,即建議使用sort_values()函數(shù)進行按值排序。
在數(shù)據(jù)框中一般都是按值排序堰酿,例如:
多表連接:
多表之間的連接也是非常常見的數(shù)據(jù)庫操作疾宏,連接分內(nèi)連接和外連接,在數(shù)據(jù)庫語言中通過join關(guān)鍵字實現(xiàn)触创,pandas我比較建議使用merger函數(shù)實現(xiàn)數(shù)據(jù)的各種連接操作灾锯。
如下是構(gòu)造一張學生的成績表:
現(xiàn)在想把學生表student與學生成績表score做一個關(guān)聯(lián),該如何操作呢嗅榕?
注意顺饮,默認情況下,merge函數(shù)實現(xiàn)的是兩個表之間的內(nèi)連接凌那,即返回兩張表中共同部分的數(shù)據(jù)兼雄。可以通過how參數(shù)設(shè)置連接的方式帽蝶,left為左連接赦肋;right為右連接;outer為外連接励稳。
左連接實現(xiàn)的是保留student表中的所有信息佃乘,同時將score表的信息與之配對,能配多少配多少驹尼,對于沒有配對上的Name趣避,將會顯示成績?yōu)镹aN。
-
六新翎、缺失值處理
現(xiàn)實生活中的數(shù)據(jù)是非常雜亂的程帕,其中缺失值也是非常常見的,對于缺失值的存在可能會影響到后期的數(shù)據(jù)分析或挖掘工作地啰,那么我們該如何處理這些缺失值呢愁拭?常用的有三大類方法,即刪除法亏吝、填補法和插值法岭埠。
刪除法:當數(shù)據(jù)中的某個變量大部分值都是缺失值,可以考慮刪除改變量蔚鸥;當缺失值是隨機分布的惜论,且缺失的數(shù)量并不是很多是,也可以刪除這些缺失的觀測株茶。
替補法:對于連續(xù)型變量来涨,如果變量的分布近似或就是正態(tài)分布的話图焰,可以用均值替代那些缺失值启盛;如果變量是有偏的,可以使用中位數(shù)來代替那些缺失值;對于離散型變量僵闯,我們一般用眾數(shù)去替換那些存在缺失的觀測卧抗。
插補法:插補法是基于蒙特卡洛模擬法,結(jié)合線性模型鳖粟、廣義線性模型社裆、決策樹等方法計算出來的預測值替換缺失值。我們這里就介紹簡單的刪除法和替補法:
這是一組含有缺失值的序列向图,我們可以結(jié)合sum函數(shù)和isnull函數(shù)來檢測數(shù)據(jù)中含有多少缺失值:
In [130]: sum(pd.isnull(s))
Out[130]: 9
直接刪除缺失值
默認情況下泳秀,dropna會刪除任何含有缺失值的行,我們再構(gòu)造一個數(shù)據(jù)框試試:
返回結(jié)果表明榄攀,數(shù)據(jù)中只要含有缺失值NaN,該數(shù)據(jù)行就會被刪除嗜傅,如果使用參數(shù)how=’all’,則表明只刪除所有行為缺失值的觀測檩赢。
使用一個常量來填補缺失值吕嘀,可以使用fillna函數(shù)實現(xiàn)簡單的填補工作:
1)用0填補所有缺失值
2)采用前項填充或后向填充
3)使用常量填充不同的列
4)用均值或中位數(shù)填充各自的列
很顯然,在使用填充法時贞瞒,相對于常數(shù)填充或前項偶房、后項填充,使用各列的眾數(shù)军浆、均值或中位數(shù)填充要更加合理一點棕洋,這也是工作中常用的一個快捷手段。
七乒融、數(shù)據(jù)透視表
在Excel中有一個非常強大的功能就是數(shù)據(jù)透視表锈麸,通過托拉拽的方式可以迅速的查看數(shù)據(jù)的聚合情況,這里的聚合可以是計數(shù)只磷、求和简软、均值、標準差等碟摆。
pandas為我們提供了非常強大的函數(shù)pivot_table()晃财,該函數(shù)就是實現(xiàn)數(shù)據(jù)透視表功能的。對于上面所說的一些聚合函數(shù)典蜕,可以通過參數(shù)aggfunc設(shè)定断盛。我們先看看這個函數(shù)的語法和參數(shù)吧:pivot_table(data,values=None,
index=None,
columns=None,
aggfunc='mean',
fill_value=None,
margins=False,
dropna=True,
margins_name='All')
data:需要進行數(shù)據(jù)透視表操作的數(shù)據(jù)框
values:指定需要聚合的字段
index:指定某些原始變量作為行索引
columns:指定哪些離散的分組變量
aggfunc:指定相應的聚合函數(shù)
fill_value:使用一個常數(shù)替代缺失值,默認不替換
margins:是否進行行或列的匯總愉舔,默認不匯總
dropna:默認所有觀測為缺失的列
margins_name:默認行匯總或列匯總的名稱為'All'
我們?nèi)匀灰詓tudent表為例钢猛,來認識一下數(shù)據(jù)透視表pivot_table函數(shù)的用法:
對一個分組變量(Sex),一個數(shù)值變量(Height)作統(tǒng)計匯總
對一個分組變量(Sex)轩缤,兩個數(shù)值變量(Height,Weight)作統(tǒng)計匯總
對兩個分組變量(Sex命迈,Age)贩绕,兩個數(shù)值變量(Height,Weight)作統(tǒng)計匯總
很顯然這樣的結(jié)果并不像Excel中預期的那樣,該如何變成列聯(lián)表的形式的壶愤?很簡單淑倾,只需將結(jié)果進行非堆疊操作(unstack)即可:
看,這樣的結(jié)果是不是比上面那種看起來更舒服一點征椒?
使用多個聚合函數(shù)
有關(guān)更多數(shù)據(jù)透視表的操作娇哆,可參考《Pandas透視表(pivot_table)詳解》一文,鏈接地址:http://python.jobbole.com/81212/
八勃救、多層索引的使用
最后我們再來講講pandas中的一個重要功能碍讨,那就是多層索引。在序列中它可以實現(xiàn)在一個軸上擁有多個索引蒙秒,就類似于Excel中常見的這種形式:
對于這樣的數(shù)據(jù)格式有什么好處呢垄开?pandas可以幫我們實現(xiàn)用低維度形式處理高維數(shù)數(shù)據(jù),這里舉個例子也許你就能明白了:
對于這種多層次索引的序列税肪,取數(shù)據(jù)就顯得非常簡單了:
對于這種多層次索引的序列溉躲,我們還可以非常方便的將其轉(zhuǎn)換為數(shù)據(jù)框的形式:
以上針對的是序列的多層次索引,數(shù)據(jù)框也同樣有多層次的索引益兄,而且每條軸上都可以有這樣的索引锻梳,就類似于Excel中常見的這種形式:
我們不妨構(gòu)造一個類似的高維數(shù)據(jù)框:
同樣,數(shù)據(jù)框中的多層索引也可以非常便捷的取出大塊數(shù)據(jù):
在數(shù)據(jù)框中使用多層索引净捅,可以將整個數(shù)據(jù)集控制在二維表結(jié)構(gòu)中疑枯,這對于數(shù)據(jù)重塑和基于分組的操作(如數(shù)據(jù)透視表的生成)比較有幫助。
就拿student二維數(shù)據(jù)框為例蛔六,我們構(gòu)造一個多層索引數(shù)據(jù)集:
講到這里荆永,我們關(guān)于pandas模塊的學習基本完成,其實在掌握了pandas這8個主要的應用方法就可以靈活的解決很多工作中的數(shù)據(jù)處理国章、統(tǒng)計分析等任務(wù)具钥。有關(guān)更多的pandas介紹,可參考pandas官方文檔:http://pandas.pydata.org/pandas-docs/version/0.17.0/whatsnew.html液兽。