Python數據分析-Pandas

——如果有想關注Java開發相關的內容,可以轉Java修煉之道
詳細觀看——

在學習了Numpy後,進行數據科學計算,爲何還要使用Pandas呢?其實原因就是效率高,那爲何Pandas效率比numpy要高呢?其實Pandas和Numpy還是有着很大的關係的,Pandas本身是依賴numpy的,而ndarray在內存裏佔據這一段連續的內存空間,任何改變ndarray長度的操作都勢必讓所有value改變內存中的位置因此在某種程度上,Numpy操作效率還是比較慢的。但是Pandas並不是處理所有的數據都是效率很高的,那麼一般情況下處理以下的數據比較友好:

Pandas適合處理多種類型的數據:

  • 具有不同數據類型列的表格數據(DataFrame),如SQL表或Excel電子表格。
  • 有序或無序(不固定頻率)的時間序列數據。
  • 帶有行和列標籤的任意矩陣數據。
  • 任何其他形式的觀測/統計數據集。
  • Pandas主要包含三種數據結構,分別是Series(一維),DataFrame(二維),Panel(三維)。其中Series和DataFrame可以用於處理絕大多數金融,統計,社會科學和許多工程領域的典型問題。
    Pandas庫是統計科學家在分析數據時的理想工具,非常適合應用於數據清洗,分析/建模然後將分析結果組織成適合於繪圖或表格顯示的形式的全部過程。那麼其中的優勢在哪呢?

優勢

  • 可以輕易地處理浮點以及非浮點類型的數據的缺失值
  • 大小可變:DataFrame和Panel都可以刪除和插入
  • 靈活強大的分組功能,可對數據集進行拆分組合
  • 切片操作,便於索引,存取數據

數據結構

  • Series:類似於一維數組的對象,由一組數據以及一組相關的數據標籤組成的數據結構。可以將Series看成是一個定長的有序字典,因爲它是索引值到數據值的一個映射。

    • 創建Series方法——pd.Series
    • 獲取數組表示形式——obj.values
    • 獲取索引對象——obj.index

      eg:
      # 第一種創建series的方式:
          s1 = pd.Series([1,2,3,4,5,6,7,8,9])
          print(s1)
          print(s1.values)    # series的值
          print(s1.index)  # 索引信息
      
      # 第二種創建series方式:
          s2 = pd.Series(np.arange(10))
          print(s2)
      
      #  第三種通過字典的方式創建series:
          s3 = pd.Series({"cecilia":90,'cc':89,'abc':97})
          print(s3)
          print(s3.index)
          s4 = pd.Series(s1.to_dict()) # 轉字典
          print(s4)
          s5 = pd.isnull(s3)
          s5.index.name = "name score" # 給列名添加名稱
          print(s5)
      
    • 通過索引存取元素

      >>>obj2 = pd.Series([4, 7,-5,3], index=['d','b','a','c']) #還能自定義index進行創建Series
      >>>obj2
      d    4
      b    7
      a   -5
      c    3
      dtype: int64
      >>> obj2.index
      Index([u'd', u'b', u'a', u'c'], dtype='object')
      
      ## 通過索引存取元素和修改元素值
      >>>obj2['d']= 6 # 修改index='d'的索引值
      d    6
      b    7
      a   -5
      c    3
      dtype: int64
      >>>obj2[['c','a','d']]  ## 選取index='c' 'a' 'd'的元素值
      c    3
      a   -5
      d    6
      dtype: int64
      
      ## 按照索引條件獲取元素
      >>>obj2[obj2>0]
      d    6
      b    7
      c    3
      dtype: int64
      
    • 檢測缺失數據——pd.innull和pd.notnull
  • DataFrame:是一個table型數據,包含一組有序的列,每列可以是不同的值類型,DataFrame既有行索引也有列索引,可以看作是由Series組成的字典。dataFrame中的數據是以一個或者多個二維塊存放的,而不是列表、字典等。

    • 創建DataFrame

      eg:
      >>> data = {'a':[1,2,3],
             'b':[4,5,6],
             'c':[7,8,9]}
      >>> df = pd.DataFrame(data)
      >>> print(df)
         a  b  c
      0  1  4  7
      1  2  5  8
      2  3  6  9
      注意:結果DataFrame會自動加上索引(跟Series一樣),且全部列會被有序悱列!!!
      
      ## 如果指定了列序列,則DataFrame的列就會按照指定順序迸行排列,如果指定的列不存在,那麼結果是一個空的dataframe
      >>>pd.DataFrame(data, columns=['b', 'a', 'c'])
         b  a  c
      0  4  1  7
      1  5  2  8
      2  6  3  9
      
    • 存取元素(其實是一個Series)

      注意:

      • 返冋的Series擁有原DataFrame相同的索引,且其name屬性也已經被相應地設置 好了。行也可以通過位置或名稱的方式進行獲取。
      • 如果採用非整數切片的方式進行選取數據,那麼末端的索引對應的數據是包含在內的,而整數切片索引,其末端的索引對應的數據是“含前不含後”。
      ## 通過字典標記或者屬性來獲取Series
      >>> data = {'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],
            'year':[2000, 2001, 2002, 2001, 2002],
            'pop':[1.5, 1.7, 3.6, 2.4, 2.9]}
      >>> df= pd.DataFrame(data, columns=['year', 'state', 'pop'])
      >>> print(df['state'])
      0      Ohio
      1      Ohio
      2      Ohio
      3    Nevada
      4    Nevada
      Name: state, dtype: object
      
      • ix、loc、iloc

        • ix——可以通過行號索引,也可以通過行標籤索引(從pandas 0.20.0版本開始,官方不推薦使用.ix方法,而是使用.iloc 和.loc方法)

        • loc——loc[‘d’]表示索引的是第’d’行(index 是字符)通過行標籤索引行數據,也可以索引某行某列

        • iloc——通過行號獲取行數據或者多行數據,但是通過行標籤獲取會報錯

          ## 承接上面的df
          >> print(df.loc[1]) # 選取第一行的數據
          state    Ohio
          year     2001
          pop       1.7
          Name: 1, dtype: object
          >> print(df.loc[0:2]) # 選取index=0到index=2行的數據,總共三行數據
            state  year  pop
          0  Ohio  2000  1.5
          1  Ohio  2001  1.7
          2  Ohio  2002  3.6
          ## 可以鎖定行,按照特徵屬性多列選取元素
          >> num_cols = ['RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars']
          >> bar_heights = norm_data.loc[0, num_cols].values
          >> print(bar_heights)
          [4.3 3.55 3.9 4.5 5.0]
          
          ## 重置索引index,通過行號獲取數據
          >> df.reset_index(inplace=True)
          >> df.head()
          >> print(df.iloc[2:4]) # 獲取第2行、第3行數據
             index   state  year  pop
          2      2    Ohio  2002  3.6
          3      3  Nevada  2001  2.4
          
    • 重建索引——reindex()函數:將會根據新索引進行重排。如果某個索引值當前不存在,就引入缺失值,可以採用填充的方式處理缺失值

      • 有幾種參數:

        參數	       說明
        index	       用作索引的新序列。既可以是index實例,也
                       可以是其他序列型的Python數據結構。Index
                       會被完全使用,就像沒有任何複製一樣。
        method     插值(填充)方式。
        fill_value  在重新索引的過程中,需要引入缺失值時使用
                       的替代值 .   
        limit	       前向或後向填充時的最大填充量.
        level	       在Multiindex的指定級別上匹配簡單索引,否
                        則選取其子集
        copy	         默認爲True,無論如何都複製;如果爲False,
                       則新舊相等就不復制
                       
        其中method方法的參數如下:
        參數	                 說明
        ffill或pad	        前向填充(或搬運)值
        bfill或backfill	    後向填充(或搬運)值
        
      • fill_value=0,直接填充0

    • 刪除任意軸上的索引值——drop(index,axis=1/0)
    • apply函數——將函數應用到由各列或行所形成的一維數組上,比如sum和mean等

      eg:
      # 將求最大值和最小值之間的差得函數運用在某一軸上
      >>>f = lambda x: x.max() - x.min()
      >>>frame.apply(f)
      >>>frame.apply(f, axis=1)
      
      
    • 排名和排序

      • sort_index——對行或列索引進行排序 (按字典順序)
      • order——針對按照值Series排序
      • rank——排名,默認情況下,rank是通過“爲各組分配一個平均排名”的方式破壞平級關係的
      eg:
      >>>frame = DataFrame(np.arange(8).reshape((2, 4)), 
          index=['three', 'one'], columns=['d','a','b','c'])
      
      >>>frame.sort_index()
      
      >>>frame.sort_index(axis=1)
      
      ## 默認的是升序排列,但也可以降序排列
      >>>frame.sort_index(axis=1, ascending=False)
      
      ## 根據一個或多個列覺得值進行排序,採用**by選項**
      >>>frame.sort_index(by=['three', 'one'])
      
      
      ## 如要按照值對Series 進行排序,那麼可以order
      >>>obj = Series([4, 7, -3, 2])
      >>>obj.order()
      2   -3
      3    2
      0    4
      1    7
      >>>obj = Series([4, np.nan, 1, np.nan, -3, 2])
      >>>obj.order() #在排序時,缺失值默認都會被放到Series的末尾.
      4    -3
      2     1
      5     2
      0     4
      1   NaN
      NaN
      
      

      注意:排名(Series.rank(method=‘average’,ascending=True))的作用與排序的不同之處在於,他會把對象的values替換成名次(從1 到 n)。這時唯一的問題在於如何處理平級項,方法裏的 method 參數就是起這個作用的,他有四個值可選:average,min, max, first。

    • is_unique——屬性驗證是否是唯一的
  • 彙總與統計

    • sum(axis=1/0)——axis=1按照行求和
    • mean(axis=1, skipna=False)——skipna選項可以避免行列存在NA得值進行計算
    • idxmin和idxmax,達到最小值或最大值的索引
    • describe——用於一次性彙總統計

處理缺失數據得方式

  • 去除

  • 填充

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