• 数据分析---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')
          
           
          
        • 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)
      
      
  • 相关阅读:
    Sentinel 授权规则 (AuthorityRule)
    【网络】TCP协议的相关实验
    冒泡排序法的逐步优化
    中断向量控制器(NVIC)
    二叉树入门算法题详解
    微信小程序-生命周期
    python教程:列表[list]和元组(tuple)
    uniapp中使用图片网络路径使用不了解决方法
    对权限的理解和使用
    板块一 Servlet编程:第五节 Cookie对象全解 来自【汤米尼克的JAVAEE全套教程专栏】
  • 原文地址:https://www.cnblogs.com/Tmars/p/18219113