Python數據分析之pandas學習

Python中的pandas模塊進行數據分析。

接下來pandas介紹中將學習到如下8塊內容:
1、數據結構簡介:DataFrame和Series
2、數據索引index
3、利用pandas查詢數據
4、利用pandas的DataFrames進行統計分析
5、利用pandas實現SQL操作
6、利用pandas進行缺失值的處理
7、利用pandas實現Excel的數據透視表功能
8、多層索引的使用

一、數據結構介紹

在pandas中有兩類非常重要的數據結構,即序列Series和數據框DataFrame。Series類似於numpy中的一維數組,除了通吃一維數組可用的函數或方法,而且其可通過索引標籤的方式獲取數據,還具有索引的自動對齊功能;DataFrame類似於numpy中的二維數組,同樣可以通用numpy數組的函數和方法,而且還具有其他靈活應用,後續會介紹到。

 

Python學習加羣:304050799

 

 

1、Series的創建

序列的創建主要有三種方式:

1)通過一維數組創建序列

  1. import numpy as np, pandas as pd
  2. arr1 = np.arange(10)
  3. arr1
  4. type(arr1)
  5.  
  6. s1 = pd.Series(arr1)
  7. s1
  8. type(s1)

2)通過字典的方式創建序列

  1. dic1 = {'a':10,'b':20,'c':30,'d':40,'e':50}
  2. dic1
  3. type(dic1)
  4.  
  5. s2 = pd.Series(dic1)
  6. s2
  7. type(s2)

3)通過DataFrame中的某一行或某一列創建序列

這部分內容我們放在後面講,因爲下面就開始將DataFrame的創建。

2、DataFrame的創建

數據框的創建主要有三種方式:

1)通過二維數組創建數據框

  1. arr2 = np.array(np.arange(12)).reshape(4,3)
  2. arr2
  3. type(arr2)
  4.  
  5. df1 = pd.DataFrame(arr2)
  6. df1
  7. type(df1)

2)通過字典的方式創建數據框

以下以兩種字典來創建數據框,一個是字典列表,一個是嵌套字典。

  1. dic2 = {'a':[1,2,3,4],'b':[5,6,7,8],
  2. 'c':[9,10,11,12],'d':[13,14,15,16]}
  3. dic2
  4. type(dic2)
  5.  
  6. df2 = pd.DataFrame(dic2)
  7. df2
  8. type(df2)
  9.  
  10. dic3 = {'one':{'a':1,'b':2,'c':3,'d':4},
  11. 'two':{'a':5,'b':6,'c':7,'d':8},
  12. 'three':{'a':9,'b':10,'c':11,'d':12}}
  13. dic3
  14. type(dic3)
  15.  
  16. df3 = pd.DataFrame(dic3)
  17. df3
  18. type(df3)

3)通過數據框的方式創建數據框

  1. df4 = df3[['one','three']]
  2. df4
  3. type(df4)
  4.  
  5. s3 = df3['one']
  6. s3
  7. type(s3)

二、數據索引index

細緻的朋友可能會發現一個現象,不論是序列也好,還是數據框也好,對象的最左邊總有一個非原始數據對象,這個是什麼呢?不錯,就是我們接下來要介紹的索引。
在我看來,序列或數據框的索引有兩大用處,一個是通過索引值或索引標籤獲取目標數據,另一個是通過索引,可以使序列或數據框的計算、操作實現自動化對齊,下面我們就來看看這兩個功能的應用。

1、通過索引值或索引標籤獲取數據

  1. s4 = pd.Series(np.array([1,1,2,3,5,8]))
  2. s4

如果不給序列一個指定的索引值,則序列自動生成一個從0開始的自增索引。可以通過index查看序列的索引:

  1. s4.index

現在我們爲序列設定一個自定義的索引值:

  1. s4.index = ['a','b','c','d','e','f']
  2. s4

序列有了索引,就可以通過索引值或索引標籤進行數據的獲取:

  1. s4[3]
  2. s4['e']
  3. s4[[1,3,5]]
  4. s4[['a','b','d','f']]
  5. s4[:4]
  6. s4['c':]
  7. s4['b':'e']

千萬注意:如果通過索引標籤獲取數據的話,末端標籤所對應的值是可以返回的!在一維數組中,就無法通過索引標籤獲取數據,這也是序列不同於一維數組的一個方面。

2、自動化對齊

如果有兩個序列,需要對這兩個序列進行算術運算,這時索引的存在就體現的它的價值了—自動化對齊.

  1. s5 = pd.Series(np.array([10,15,20,30,55,80]),
  2. index = ['a','b','c','d','e','f'])
  3. s5
  4. s6 = pd.Series(np.array([12,11,13,15,14,16]),
  5. index = ['a','c','g','b','d','f'])
  6. s6
  7.  
  8. s5 + s6
  9. s5/s6

由於s5中沒有對應的g索引,s6中沒有對應的e索引,所以數據的運算會產生兩個缺失值NaN。注意,這裏的算術結果就實現了兩個序列索引的自動對齊,而非簡單的將兩個序列加總或相除。對於數據框的對齊,不僅僅是行索引的自動對齊,同時也會自動對齊列索引(變量名)

數據框中同樣有索引,而且數據框是二維數組的推廣,所以其不僅有行索引,而且還存在列索引,關於數據框中的索引相比於序列的應用要強大的多,這部分內容將放在數據查詢中講解。

三、利用pandas查詢數據

這裏的查詢數據相當於R語言裏的subset功能,可以通過布爾索引有針對的選取原數據的子集、指定行、指定列等。我們先導入一個student數據集:

  1. student = pd.io.parsers.read_csv('C:\\Users\\admin\\Desktop\\student.csv')

查詢數據的前5行或末尾5行

  1. student.head()
  2. student.tail()

查詢指定的行

  1. student.ix[[0,2,4,5,7]] #這裏的ix索引標籤函數必須是中括號[]

查詢指定的列

  1. student[['Name','Height','Weight']].head() #如果多個列的話,必須使用雙重中括號

也可以通過ix索引標籤查詢指定的列

  1. student.ix[:,['Name','Height','Weight']].head()

查詢指定的行和列

  1. student.ix[[0,2,4,5,7],['Name','Height','Weight']].head()

以上是從行或列的角度查詢數據的子集,現在我們來看看如何通過布爾索引實現數據的子集查詢。
查詢所有女生的信息

  1. student[student['Sex']=='F']

查詢出所有12歲以上的女生信息

  1. student[(student['Sex']=='F') & (student['Age']>12)]

查詢出所有12歲以上的女生姓名、身高和體重

  1. student[(student['Sex']=='F') & (student['Age']>12)][['Name','Height','Weight']]

上面的查詢邏輯其實非常的簡單,需要注意的是,如果是多個條件的查詢,必須在&(且)或者|(或)的兩端條件用括號括起來。

四、統計分析

pandas模塊爲我們提供了非常多的描述性統計分析的指標函數,如總和、均值、最小值、最大值等,我們來具體看看這些函數:
首先隨機生成三組數據

  1. np.random.seed(1234)
  2. d1 = pd.Series(2*np.random.normal(size = 100)+3)
  3. d2 = np.random.f(2,4,size = 100)
  4. d3 = np.random.randint(1,100,size = 100)
  5.  
  6. d1.count() #非空元素計算
  7. d1.min() #最小值
  8. d1.max() #最大值
  9. d1.idxmin() #最小值的位置,類似於R中的which.min函數
  10. d1.idxmax() #最大值的位置,類似於R中的which.max函數
  11. d1.quantile(0.1) #10%分位數
  12. d1.sum() #求和
  13. d1.mean() #均值
  14. d1.median() #中位數
  15. d1.mode() #衆數
  16. d1.var() #方差
  17. d1.std() #標準差
  18. d1.mad() #平均絕對偏差
  19. d1.skew() #偏度
  20. d1.kurt() #峯度
  21. d1.describe() #一次性輸出多個描述性統計指標

必須注意的是,descirbe方法只能針對序列或數據框,一維數組是沒有這個方法的

這裏自定義一個函數,將這些統計描述指標全部彙總到一起:

  1. def stats(x):
  2. return pd.Series([x.count(),x.min(),x.idxmin(),
  3. x.quantile(.25),x.median(),
  4. x.quantile(.75),x.mean(),
  5. x.max(),x.idxmax(),
  6. x.mad(),x.var(),
  7. x.std(),x.skew(),x.kurt()],
  8. index = ['Count','Min','Whicn_Min',
  9. 'Q1','Median','Q3','Mean',
  10. 'Max','Which_Max','Mad',
  11. 'Var','Std','Skew','Kurt'])
  12. stats(d1)

在實際的工作中,我們可能需要處理的是一系列的數值型數據框,如何將這個函數應用到數據框中的每一列呢?可以使用apply函數,這個非常類似於R中的apply的應用方法。
將之前創建的d1,d2,d3數據構建數據框:

  1. df = pd.DataFrame(np.array([d1,d2,d3]).T,columns=['x1','x2','x3'])
  2. df.head()
  3. df.apply(stats)

非常完美,就這樣很簡單的創建了數值型數據的統計性描述。如果是離散型數據呢?就不能用這個統計口徑了,我們需要統計離散變量的觀測數、唯一值個數、衆數水平及個數。你只需要使用describe方法就可以實現這樣的統計了。

  1. student['Sex'].describe()

除以上的簡單描述性統計之外,還提供了連續變量的相關係數(corr)和協方差矩陣(cov)的求解,這個跟R語言是一致的用法。

  1. df.corr()

關於相關係數的計算可以調用pearson方法或kendell方法或spearman方法,默認使用pearson方法。

  1. df.corr('spearman')

如果只想關注某一個變量與其餘變量的相關係數的話,可以使用corrwith,如下方只關心x1與其餘變量的相關係數:

  1. df.corrwith(df['x1'])

數值型變量間的協方差矩陣

  1. df.cov()

    五、類似於SQL的操作

    在SQL中常見的操作主要是增、刪、改、查幾個動作,那麼pandas能否實現對數據的這幾項操作呢?答案是Of Course!

    增:添加新行或增加新列

    1. In [99]: dic = {'Name':['LiuShunxiang','Zhangshan'],
    2. ...: 'Sex':['M','F'],'Age':[27,23],
    3. ...: 'Height':[165.7,167.2],'Weight':[61,63]}
    4.  
    5. In [100]: student2 = pd.DataFrame(dic)
    6.  
    7. In [101]: student2
    8. Out[101]:
    9. Age Height Name Sex Weight
    10. 0 27 165.7 LiuShunxiang M 61
    11. 1 23 167.2 Zhangshan F 63

    現在將student2中的數據新增到student中,可以通過concat函數實現:

    注意到了嗎?在數據庫中union必須要求兩張表的列順序一致,而這裏concat函數可以自動對齊兩個數據框的變量!

    新增列的話,其實在pandas中就更簡單了,例如在student2中新增一列學生成績:

    對於新增的列沒有賦值,就會出現空NaN的形式。

    刪:刪除表、觀測行或變量列

    刪除數據框student2,通過del命令實現,該命令可以刪除Python的所有對象。

    刪除指定的行

    原數據中的第1,2,4,7行的數據已經被刪除了。
    根據布爾索引刪除行數據,其實這個刪除就是保留刪除條件的反面數據,例如刪除所有14歲以下的學生:

    刪除指定的列

    我們發現,不論是刪除行還是刪除列,都可以通過drop方法實現,只需要設定好刪除的軸即可,即調整drop方法中的axis參數。默認該參數爲0,表示刪除行觀測,如果需要刪除列變量,則需設置爲1。

    改:修改原始記錄的值

    如果發現表中的某些數據錯誤了,如何更改原來的值呢?我們試試結合布爾索引和賦值的方法:
    例如發現student3中姓名爲Liushunxiang的學生身高錯了,應該是173,如何改呢?

    這樣就可以把原來的身高修改爲現在的170了。
    看,關於索引的操作非常靈活、方便吧,就這樣輕鬆搞定數據的更改。

    查:有關數據查詢部分,上面已經介紹過,下面重點講講聚合、排序和多表連接操作。

    聚合:pandas模塊中可以通過groupby()函數實現數據的聚合操作

    根據性別分組,計算各組別中學生身高和體重的平均值:

    如果不對原始數據作限制的話,聚合函數會自動選擇數值型數據進行聚合計算。如果不想對年齡計算平均值的話,就需要剔除改變量:

    groupby還可以使用多個分組變量,例如根本年齡和性別分組,計算身高與體重的平均值:

    當然,還可以對每個分組計算多個統計量:

    是不是很簡單,只需一句就能完成SQL中的SELECT…FROM…GROUP BY…功能,何樂而不爲呢?

    排序:

    排序在日常的統計分析中還是比較常見的操作,我們可以使用order、sort_index和sort_values實現序列和數據框的排序工作:

    我們再試試降序排序的設置:

    上面兩個結果其實都是按值排序,並且結果中都給出了警告信息,即建議使用sort_values()函數進行按值排序。

    在數據框中一般都是按值排序,例如:

    多表連接:

    多表之間的連接也是非常常見的數據庫操作,連接分內連接和外連接,在數據庫語言中通過join關鍵字實現,pandas我比較建議使用merger函數實現數據的各種連接操作。
    如下是構造一張學生的成績表:

    現在想把學生表student與學生成績表score做一個關聯,該如何操作呢?

    注意,默認情況下,merge函數實現的是兩個表之間的內連接,即返回兩張表中共同部分的數據。可以通過how參數設置連接的方式,left爲左連接;right爲右連接;outer爲外連接。

    左連接實現的是保留student表中的所有信息,同時將score表的信息與之配對,能配多少配多少,對於沒有配對上的Name,將會顯示成績爲NaN。

  2. 六、缺失值處理

    現實生活中的數據是非常雜亂的,其中缺失值也是非常常見的,對於缺失值的存在可能會影響到後期的數據分析或挖掘工作,那麼我們該如何處理這些缺失值呢?常用的有三大類方法,即刪除法、填補法和插值法。
    刪除法:當數據中的某個變量大部分值都是缺失值,可以考慮刪除改變量;當缺失值是隨機分佈的,且缺失的數量並不是很多是,也可以刪除這些缺失的觀測。
    替補法:對於連續型變量,如果變量的分佈近似或就是正態分佈的話,可以用均值替代那些缺失值;如果變量是有偏的,可以使用中位數來代替那些缺失值;對於離散型變量,我們一般用衆數去替換那些存在缺失的觀測。
    插補法:插補法是基於蒙特卡洛模擬法,結合線性模型、廣義線性模型、決策樹等方法計算出來的預測值替換缺失值。

    我們這裏就介紹簡單的刪除法和替補法:

    這是一組含有缺失值的序列,我們可以結合sum函數和isnull函數來檢測數據中含有多少缺失值:

    1. In [130]: sum(pd.isnull(s))
    2. Out[130]: 9

    直接刪除缺失值

    默認情況下,dropna會刪除任何含有缺失值的行,我們再構造一個數據框試試:

    返回結果表明,數據中只要含有缺失值NaN,該數據行就會被刪除,如果使用參數how=’all’,則表明只刪除所有行爲缺失值的觀測。

    使用一個常量來填補缺失值,可以使用fillna函數實現簡單的填補工作:
    1)用0填補所有缺失值

    2)採用前項填充或後向填充

    3)使用常量填充不同的列

    4)用均值或中位數填充各自的列

    很顯然,在使用填充法時,相對於常數填充或前項、後項填充,使用各列的衆數、均值或中位數填充要更加合理一點,這也是工作中常用的一個快捷手段。

    七、數據透視表

    在Excel中有一個非常強大的功能就是數據透視表,通過托拉拽的方式可以迅速的查看數據的聚合情況,這裏的聚合可以是計數、求和、均值、標準差等。
    pandas爲我們提供了非常強大的函數pivot_table(),該函數就是實現數據透視表功能的。對於上面所說的一些聚合函數,可以通過參數aggfunc設定。我們先看看這個函數的語法和參數吧:

    1. pivot_table(data,values=None,
    2. index=None,
    3. columns=None,
    4. aggfunc='mean',
    5. fill_value=None,
    6. margins=False,
    7. dropna=True,
    8. margins_name='All')
    9. data:需要進行數據透視表操作的數據框
    10. values:指定需要聚合的字段
    11. index:指定某些原始變量作爲行索引
    12. columns:指定哪些離散的分組變量
    13. aggfunc:指定相應的聚合函數
    14. fill_value:使用一個常數替代缺失值,默認不替換
    15. margins:是否進行行或列的彙總,默認不彙總
    16. dropna:默認所有觀測爲缺失的列
    17. margins_name:默認行彙總或列彙總的名稱爲'All'

    我們仍然以student表爲例,來認識一下數據透視表pivot_table函數的用法:
    對一個分組變量(Sex),一個數值變量(Height)作統計彙總

    對一個分組變量(Sex),兩個數值變量(Height,Weight)作統計彙總

    對兩個分組變量(Sex,Age),兩個數值變量(Height,Weight)作統計彙總

    很顯然這樣的結果並不像Excel中預期的那樣,該如何變成列聯表的形式的?很簡單,只需將結果進行非堆疊操作(unstack)即可:

    看,這樣的結果是不是比上面那種看起來更舒服一點?

    使用多個聚合函數

    有關更多數據透視表的操作,可參考《Pandas透視表(pivot_table)詳解》一文,鏈接地址:http://python.jobbole.com/81212/

    八、多層索引的使用

    最後我們再來講講pandas中的一個重要功能,那就是多層索引。在序列中它可以實現在一個軸上擁有多個索引,就類似於Excel中常見的這種形式:

    對於這樣的數據格式有什麼好處呢?pandas可以幫我們實現用低維度形式處理高維數數據,這裏舉個例子也許你就能明白了:

    對於這種多層次索引的序列,取數據就顯得非常簡單了:

    對於這種多層次索引的序列,我們還可以非常方便的將其轉換爲數據框的形式:

    以上針對的是序列的多層次索引,數據框也同樣有多層次的索引,而且每條軸上都可以有這樣的索引,就類似於Excel中常見的這種形式:

    我們不妨構造一個類似的高維數據框:

    同樣,數據框中的多層索引也可以非常便捷的取出大塊數據:

    在數據框中使用多層索引,可以將整個數據集控制在二維表結構中,這對於數據重塑和基於分組的操作(如數據透視表的生成)比較有幫助。
    就拿student二維數據框爲例,我們構造一個多層索引數據集:

    講到這裏,我們關於pandas模塊的學習基本完成,其實在掌握了pandas這8個主要的應用方法

Python加羣一起學習:

 

Python最佳學習路線圖

 

python語言基礎
(1)Python3入門,數據類型,字符串
(2)判斷/循環語句,函數,命名空間,作用域
(3)類與對象,繼承,多態
(4)tkinter界面編程
(5)文件與異常,數據處理簡介
(6)Pygame實戰飛機大戰,2048

python語言高級
(1)Python常見第三方庫與網絡編程
(2)Python正則表達式
(3)郵箱爬蟲,文件遍歷,金融數據爬蟲,多線程爬蟲
(4)Python線程、進程
(5)Python MySQL數據庫,協程,jython

python全棧工程師前端
(1) HTML
(2) HTML5
(3) CSS
(4) CSS3
(5) 網頁界面設計實戰
(6) javaScript
(7) jquerry
(8) jquerry EasyUI, Mobile簡介,photoshop
(9) Bootstrap

python全棧工程師後端
(1) Django入門
(2) Django高級
(3) Django實戰

python全棧工程師後端高級
(1) Flask開發原理
(2) Flask開發項目實踐
(3) Tornado開發原理
(4) Tornado開發項目實踐

Linux基礎

(1) 文件處理命令
(2) 權限管理命令
(3) 幫助命令
(4) 文件搜索命令
(5) 壓縮解壓命令
(6) 命令使用技巧
(7) VIM使用
(8) 軟件包管理
(9) 用戶和用戶組管理
(10) Linux Shell開發

Linux運維自動化開發
(1) Python開發Linux運維
(2) Linux運維報警工具開發
(3) Linux運維報警安全審計開發
(4) Linux業務質量報表工具開發
(5) Kali安全檢測工具檢測
(6) Kali 密碼破解實戰

python數據分析
(1) numpy數據處理
(2) pandas數據分析
(3) matplotlib數據可視化
(4) scipy數據統計分析
(5) python 金融數據分析

python大數據
(1) Hadoop HDFS
(2) python Hadoop MapReduce
(3) python Spark core
(4) python Spark SQL
(5) python Spark MLlib

python機器學習
(1) 機器學習基礎知識簡介
(2) KNN算法
(3) 線性迴歸
(4) 邏輯斯蒂迴歸算法
(5) 決策樹算法
(6) 樸素貝葉斯算法
(7) 支持向量機
(8) 聚類k-means算法

 

Python學習加羣:30405--0799

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章