数据分析---pandas模块

为什么要学习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)