資料分析---pandas模組

tmars發表於2024-05-29

為什麼要學習pandas?

  • numpy已經可以幫助我們進行資料的處理了,那麼學習pandas的目的是什麼呢?
    • numpy能夠幫助我們處理的是數值型的資料,當然在資料分析中除了數值型的資料還有好多其他型別的資料(字串,時間序列),那麼pandas就可以幫我們很好的處理除了數值型的其他資料

什麼是pandas?

  • 首先先來認識pandas中的兩個常用的類
    • Series
    • DataFrame

Series

  • Series是一種類似與一維陣列的物件,由下面兩個部分組成:

    • values:一組資料(ndarray型別)
    • index:相關的資料索引標籤
  • Series的建立

    • 由列表或numpy陣列建立
    • 由字典建立
    from pandas import Series
    s = Series(data=[1,2,3,'four]) # 建立一個有索引的資料
    s
    程式碼結果:
    0       1
    1       2
    2       3
    3    four
    dtype: object
    
    import numpy as np
    s = Series(data = np.random.randint(0,100,size=(3,))) # 使用numpy模組和pandas模組中的Series類,建立一個3行0列的簡單表格
    s
    程式碼結果:
    0     3
    1    43
    2    82
    dtype: int64
    
    from pandas import Series
    s = Series(data=[1,2,3,'four'],index=['a','b','c','d']) # 建立一個表格,行索引是a,b,c,d 對應的值是data中的元素
    s
    程式碼結果:
    a       1
    b       2
    c       3
    d    four
    dtype: object
    
  • 為什麼需要有顯示索引

    • 顯示索引可以增強Series的可讀性

      form pandas import Series
      dic ={
        '語文':100,
        '數學':120,
        '英語':125,
      }
      s = Series(data=dic)
      s
      程式碼結果:
      語文    100
      數學     99
      理綜    250
      dtype: int64
      
  • Series的索引和切片

    from pandas import Series
    dic = {
      '語文':100,
      '數學':120,
      '英語':125
    }
    s = Series(data=dic)
    s
    程式碼結果:
    語文    100
    數學    120
    理綜    125
    dtype: int64
    
    s[0] # 取出索引為0,第一行語文的資料
    s.語文 # 直接取出語文這一行的資料
    s.[0:2] # 取出索引0-2的資料,就是語文、數學這兩行
    
  • Series的常用屬性

    • s.shape 顯示元素的行數
    • s.size 顯示元素的個數,索引
    • s.index 元素的列索引
    • s.values 返回值
    • s.dtype 元素的型別
  • Series的常用方法

    • head(),tail()

    • unique()

    • isnull(),notnull()

    • add() sub() mul() div()

      import numpy as np
      from pandas import Series
      s = Series(data = np.random.randint(1,100),size=(4,))
      
      程式碼結果:
      0    12
      1    51
      2    50
      3    96
      dtype: int32
      
      s.head(2) # 顯示前2行的資料
      程式碼結果:
      0    12
      1    51
      dtype: int32
      
      s.tail(2) # 顯示後3個資料
      程式碼結果:
      0    12
      1    51
      dtype: int32
      
      s.unique() # 去重
      程式碼結果:
      array([12, 51, 50, 96])
      
      s.isnull() # 用於判斷每一個元素是否為空,為空返回True,否則返回False
      程式碼結果:
      0    False
      1    False
      2    False
      3    False
      dtype: bool
      
      s.notnull() 
      程式碼結果:
      0    False
      1    False
      2    False
      3    False
      dtype: bool
      
      
      

DataFrame

  • DataFrame是一個【表格型】的資料結構。DataFrame由按一定順序排列的多列資料組成。設計初衷是將Series的使用場景從一維擴充到多維。DataFrame既有行索引,也有列索引。

    • 行索引:index
    • 列索引:columns
    • 值:values
  • DataFrame的建立

    • ndarray建立
    • 字典建立
    from pandas import DataFrame
    df = DataFrame(data=([1,2,3],[1,2,3])) 建立一個二維的表格
    df
    程式碼結果:
    | 0    | 1    | 2    |
    | ---- | ---- | ---- |
    | 0    | 1    | 2    |
    | 1    | 1    | 2    |
    
    from pandas import DataFrame
    import numpy as np
    df = DataFrame(data=np.random.randint(1,100,size=(3,4)))
    df
    程式碼結果:
    | 0    | 1    | 2    | 3    |
    | ---- | ---- | ---- | ---- |
    | 0    | 9    | 68   | 39   |
    | 1    | 86   | 83   | 53   |
    | 2    | 68   | 82   | 80   |
    
    
    import numpy as np
    from pandas import DataFrame
    dic = {
        'name':['zt','cy','xcy'],
        'salary':[1000,2000,3000]
    }
    
    df = DataFrame(data=dic,index=['a','b','c'])
    df
    程式碼結果:
    | -----|  name  | salary |
    | ---- | ------ |  ----- |
    | a    | zt     |  1000  |
    | b    | cy     |  2000  |
    | c    | xcy    |  3000  |
    
  • DataFrame的屬性

    • values、columns、index、shape

      • df.values:

           array([['zt', 1000],
                  ['cy', 2000],
                  ['xcy', 3000]], dtype=object)
        
      • df.columns:

           Index(['name', 'salary'], dtype='object')
        
      • df.index:

               Index(['a', 'b', 'c'], dtype='object')
        
         </details>
        
      • df.shape:

      (3, 2)
      
    • 練習:
      根據以下考試成績表,建立一個DataFrame,命名為df:

          張三  李四  
      語文 150  0
      數學 150  0
      英語 150  0
      理綜 300  0
      
       import numpy as np
       from pandas import DataFrame
       dic = {
           '張三':[150,150,150,150],
           '李四':[0,0,0,0],
       }
       df = DataFrame(data=dic,index=['語文','數學','英語','理綜'])
       df
      
  • DataFrame索引操作

    • 對行進行索引
        import numpy as np
        from pandas import DataFrame
        df = DataFrame(data = np.random.randint(1,100,size=(4,5)),index=['a','b','c','d'])
        df
      
        程式碼結果:
        | 0    | 1    | 2    | 3    | 4    |
        | ---- | ---- | ---- | ---- | ---- |
        | a    | 72   | 4    | 35   | 97   |
        | b    | 53   | 36   | 4    | 75   |
        | c    | 65   | 35   | 25   | 55   |
        | d    | 8    | 68   | 52   | 33   |
      
    • 對列進行索引
        import numpy as np
        from pandas import DataFrame
        df = DataFrame(data = np.random.randint(1,100,size=(9,5)),columns=['a','b','c','d','e'])
        df
      
        程式碼結果:
        | a    | b    | c    | d    | e    |
        | ---- | ---- | ---- | ---- | ---- |
        | 0    | 87   | 35   | 75   | 10   |
        | 1    | 12   | 83   | 11   | 14   |
        | 2    | 57   | 8    | 62   | 99   |
        | 3    | 29   | 55   | 96   | 37   |
        | 4    | 66   | 65   | 1    | 94   |
        | 5    | 32   | 54   | 17   | 75   |
        | 6    | 48   | 26   | 65   | 46   |
        | 7    | 3    | 6    | 10   | 14   |
        | 8    | 14   | 26   | 32   | 96   |
      
    • 對元素進行索引
      df['a'] # 取單列,如果df有顯示的索引,透過索引機制去行或者列的時候只可以使用顯示索引
      df[['a','c']] # 取多列
      
      iloc:
          # 透過隱式索引取行
      loc:
          # 透過顯示索引取行
      
      df.loc[0] # 取單行
      df.iloc[[0,3,5]] # 取多行
      
      #取單個元素
      df.iloc[0,2]
      df.loc[0,'a']
      
      #取多個元素
      df.iloc[[1,3,5],2]
      
  • DataFrame的切片操作

    • 對行進行切片

      | a    | b    | c    | d    |
      | ---- | ---- | ---- | ---- |
      | 0    | 95   | 87   | 83   |
      | 1    | 76   | 82   | 78   |
      | 2    | 69   | 94   | 89   |
      | 3    | 74   | 77   | 93   |
      | 4    | 75   | 88   | 93   |
      | 5    | 67   | 98   | 66   |
      | 6    | 95   | 83   | 71   |
      | 7    | 72   | 74   | 79   |
       
      df[0:2] # 切行
      程式碼結果:
      | a    | b    | c    | d    |
      | ---- | ---- | ---- | ---- |
      | 0    | 95   | 87   | 83   |
      | 1    | 76   | 82   | 78   |
      
      
      df.iloc[:,0:2] # 切列
      程式碼結果:
      | a    | b    |
      | ---- | ---- |
      | 0    | 95   |
      | 1    | 76   |
      | 2    | 69   |
      | 3    | 74   |
      | 4    | 75   |
      | 5    | 67   |
      | 6    | 95   |
      | 7    | 72   |
      
    • 對列進行切片

      df.iloc[:,0:2] # 切列
      程式碼結果:
      | a    | b    |
      | ---- | ---- |
      | 0    | 95   |
      | 1    | 76   |
      | 2    | 69   |
      | 3    | 74   |
      | 4    | 75   |
      | 5    | 67   |
      | 6    | 95   |
      | 7    | 72   |
      
  • 總結:df索引和切片操作

    • 索引:
      • df[col]:取列
      • df.loc[index]:取行
      • df.iloc[index,col]:取元素
    • 切片:
      • df[index1:index3]:切行
      • df.iloc[:,col1:col3]:切列
  • 練習題:

    1. 假設ddd是期中考試成績,ddd2是期末考試成績,請自由建立ddd2,並將其與ddd相加,求期中期末平均值。
    import numpy as np
    from pandas import DataFrame
    dic1 ={
        '張三':[150,150,150,150],
        '李四':[0,0,0,0]
    }
    dic2={
        '張三':[120,120,120,120],
        '李四':[15,15,15,15]
    }
    ddd = DataFrame(data=dic1,index=['語文','數學','英語','理綜'])
    ddd2 = DataFrame(data=dic2,index=['語文','數學','英語','理綜'])
    (ddd + ddd2) / 2  # 其中期末的平均值
    
    程式碼結果:
    | 張三   | 李四    |
    |  ---- | ----- |
    | 語文   | 135.0 |
    | 數學   | 135.0 |
    | 英語   | 135.0 |
    | 理綜   | 135.0 |
    
    
    2. 假設張三期中考試數學被發現作弊,要記為0分,如何實現?
    dd.loc['數學','張三'] = 0
    ddd
    
    程式碼結果:
    | 張三   | 李四   |
    | ---- | ---- |
    | 語文   | 150  |
    | 數學   | 0    |
    | 英語   | 150  |
    | 理綜   | 150  |
    
    3. 李四因為舉報張三作弊立功,期中考試所有科目加100分,如何實現?
    ddd['李四'] += 100
    ddd
    
    程式碼結果:
    | 張三   | 李四   |
    | ---- | ---- |
    | 語文   | 150  |
    | 數學   | 0    |
    | 英語   | 150  |
    | 理綜   | 150  |
    
    4. 後來老師發現有一道題出錯了,為了安撫學生情緒,給每位學生每個科目都加10分,如何實現?
    ddd += 10
    ddd
    
    程式碼結果:
    | 張三   | 李四   |
    | ---- | ---- |
    | 語文   | 160  |
    | 數學   | 10   |
    | 英語   | 160  |
    | 理綜   | 160  |
    
  • 擴充:時間資料型別的轉換

    • pd.to_datetime(col)
  • 將某一列設定為行索引

    • df.set_index()
    dic = {
        'time':['2010-10-10','2011-11-20','2020-01-10'],
        'temp':[33,31,30]
    }
    df = DataFrame(data=dic)
    df
    
    |      | time       | temp  | 
    | ---- | ---------- |       |
    | 0    | 2010-10-10 |  33   |
    | 1    | 2011-11-20 |  31   |
    | 2    | 2020-01-10 |  30   |
    
    #檢視time列的型別
    df['time'].dtype
    dtype('O')
    
    
    import pandas as pd
    #將time列的資料型別轉換成時間序列型別
    df['time'] = pd.to_datetime(df['time'])
    df['time']
    
    #將time列作為源資料的行索引
    df.set_index('time',inplace=True)
    
    

相關文章