1. 程式人生 > >Python的pandas包的學習

Python的pandas包的學習

min 註意 table doc max nump obb 顯示 arm

一:pandas的數據類型

  pandas中最重要的數據類型是Series序列 和 DataFrame數據框,Series相當於Numpy中的一維數組,不同之處series會自帶索引值。dataframe相當於numpy的二維數組。

  1.1)Series的創建---有兩種方式:通過一維數組 和 字典

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

      技術分享

      OUT:

      技術分享

    2)通過字典創建序列

      技術分享

     OUT:

      技術分享

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

  2.2)創建DataFrame

    1) 通過二維數組創建

      技術分享

      OUT:

      技術分享

    2)通過字典列表創建

      技術分享

      OUT:

      技術分享

    3)通過嵌套字典

      技術分享

     OUT:

      技術分享

    4)通過dataframe創建dataframe

      技術分享

      OUT:

      技術分享

二:數據索引Index

    2.1) 獲取Series序列的數據----如果沒有給序列指定索引,那麽就創建一個從0開始自增的序列,df.index來獲取索引值,或通過df.index來指定索引值

      series序列是一維數組,可以通過索引切片來獲取數據

    2.2)獲取DataFrame的數據

        1)獲取列數據-- df[列名] 或 使用點運算符 df.列名

        2)獲取行數據

            a) df.iloc[索引值] (只適用於數字標簽的索引)

            b) df.loc[ ‘ ‘] , 適用於索引是字符串標簽

            c) df.ix[‘ ‘ ] , 主要用於字符串標簽的索引,也可作為數字索引的備選

    2.3) 自動化對齊

      對pandas的series序列進行運算時,有相同的索引值上進行運算,索引值不同就進行自動補齊

三:查詢數據

  引入數據集

    df = pf.read_csv( ‘文件路徑名‘ , header = None) (header 表示返回的數據是否有別名)

          student = pd.read_csv(‘ ‘)          

  查詢前幾行 或 後幾行

    student.head(5 )

    student.tail(5)

  查詢指定的行

    student.ix[ ] # 索引是字符串或數字,多行索引必須使用兩個中括號student.ix[[ ]]

    student.loc[ ] # 索引字符串

    student.iloc[ ] # 索引數字

  查詢指定的列

    student[列名] 或 student.列名

    查詢多個列 student [[‘Name‘ , ‘Height‘ , ‘Weight‘]]

  通過ix查詢指定的列

    student [:,[‘Name‘ , ‘Height‘ , ‘Weight‘]]

  查詢指定的行和列

    student [[0,2,4],[‘Name‘ , ‘Height‘ , ‘Weight‘]]

  下面通過布爾索引來實現特定信息的查詢

  student[student[‘sex‘] == F] --- 查詢所有性別為女生的信息

  student[(student[‘sex‘] == F) & (stuent[‘age‘] > 18)] -- 多條件查詢,查詢所有性別為女且年齡大於18歲的信息

  student[(student[‘sex‘] == F) & (stuent[‘age‘] > 18)] [[‘name‘ , ‘height‘]] --查詢性別為女,年齡大於18的學生的姓名 和 體重

 四:統計分析     

    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. d1.count() #非空元素計算
  6. d1.min() #最小值
  7. d1.max() #最大值
  8. d1.idxmin() #最小值的位置,類似於R中的which.min函數
  9. d1.idxmax() #最大值的位置,類似於R中的which.max函數
  10. d1.quantile(0.1) #10%分位數
  11. d1.sum() #求和
  12. d1.mean() #均值
  13. d1.median() #中位數
  14. d1.mode() #眾數
  15. d1.var() #方差
  16. d1.std() #標準差
  17. d1.mad() #平均絕對偏差
  18. d1.skew() #偏度
  19. d1.kurt() #峰度
  20. d1.describe() #一次性輸出多個描述性統計指標

在實際的工作中,我們可能需要處理的是一系列的數值型數據框,如何將這個函數應用到數據框中的每一列呢?可以使用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的操作

  5.1)增加新行或新列

    技術分享

    OUT:

    技術分享

    雖然d2數據框只有3行1列,d3經過concat方法後,變成6行4列,d3的行數=d1的行數+d2的行數,d3的列數=d1的列數+d2的列數

    新增一列--- 為不存在的列賦值會創建新列,如 d1[‘four‘] = 11

  5.2) 刪除

    1)刪除數據框 --- del d1

    2) 刪除指定的行 ---d1.drop([‘a‘ , ‘b‘] ) ,刪除 d1數據框索引值為a和b的數據 

    3) 刪除指定的列 --- d1.drop(‘one‘ , ‘two‘ ,axis =1) ,通過指定axis的值來表明是刪除列還是行,axis默認值是0,0為行,1為列

    4)布爾索引對數據框的查詢,實際上也是刪除數據操作,返回滿足條件的數據

  5.3)改,修改數據中的值

    技術分享 

  5.4)查,重點講解聚合、排序、多表鏈接操作

    1)group by 聚合函數

      如果不對聚合函數做限制的話,group by會對數值型數據進行聚合計算,如students數據框,有name,height,weight,sex,age列,name列是字符串,所以不會進行計算.

      技術分享

      通過drop刪除該變量

       技術分享

      groupby還可以設置多個分組變量,例如對年齡和性別分組,來計算年齡和身高的平均值

        技術分享

      還可以對每個分組進行多個統計量的計算,通過agg([ , ,])

         技術分享

    2) 排序

        在日常的統計工作中,排序是很重要的,可以通過order , sort_index,sort_values實現序列和數據框的排序操作

        1:order

          s1 = dp.Series(np.array(np.random.randint(1,20,10)))        

                

    3) 多表連接

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

     技術分享

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

      技術分享

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

      技術分享

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

六:缺失值處理

  現實生活中的數據是非常雜亂的,其中缺失值也是非常常見的,對於缺失值的存在可能會影響到後期的數據分析或挖掘工作,那麽我們該如何處理這些缺失值呢?常用的有三大類方法,即刪除法、填補法和插值法。

刪除法:當數據中的某個變量大部分值都是缺失值,可以考慮刪除改變量;當缺失值是隨機分布的,且缺失的數量並不是很多是,也可以刪除這些缺失的觀測。
替補法:對於連續型變量,如果變量的分布近似或就是正態分布的話,可以用均值替代那些缺失值;如果變量是有偏的,可以使用中位數來代替那些缺失值;對於離散型變量,我們一般用眾數去替換那些存在缺失的觀測。
插補法:插補法是基於蒙特卡洛模擬法,結合線性模型、廣義線性模型、決策樹等方法計算出來的預測值替換缺失值。

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

      技術分享

      

這是一組含有缺失值的序列,我們可以結合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個主要的應用方法就可以靈活的解決很多工作中的數據處理、統計分析等任務。有關更多的pandas介紹,可參考pandas官方文檔:http://pandas.pydata.org/pandas-docs/version/0.17.0/whatsnew.html。

Python的pandas包的學習