• pandas模块的使用详解


    为什么学习pandas

    • numpy已经可以帮助我们进行数据的处理了,那么学习pandas的目的是什么呢?
      • numpy能够帮助我们处理的是数值型的数据,当然在数据分析中除了数值型的数据还有好多其他类型的数据(字符串,时间序列),那么pandas就可以帮我们很好的处理除了数值型的其他数据!

    什么是pandas?

    • 首先先来认识pandas中的两个常用的类
      • Series
      • DataFrame

    Series

    • Series是一种类似与一维数组的对象,由下面两个部分组成:

      • values:一组数据(ndarray类型)
      • index:相关的数据索引标签
    • Series的创建

      • 由列表或numpy数组创建
      • 由字典创建
    import pandas as pd
    from pandas import Series,DataFrame
    import numpy as np
    
    #Series这个数据结构中存储的数据一定得是一个维度
    s1 = Series(data=[1,2,3,4,5])
    
    # 结果如下
    0    1
    1    2
    2    3
    3    4
    4    5
    dtype: int64
        
        
    s2 = Series(data=np.random.randint(0,100,size=(4,)))
    
    # 结果如下
    0    54
    1    90
    2    21
    3    92
    dtype: int32
    
    # 创建一个字典
    dic = {
        'a':1,
        'b':2,
        'c':3
    }
    #Series的索引可以为字符串
    s3 = Series(data=dic)
    
    # 结果如下
    a    1
    b    2
    c    3
    dtype: int64
    
    
    #index指定显式索引
    s4 = Series(data=[1,2,3],index=['数学','英语','理综'])
    
    # 结果如下
    数学    1
    英语    2
    理综    3
    dtype: int64
    
    • Series的索引

      • 隐式索引:数值型
      • 显式所用:自定义(字符串)
        • 提高数据的可读性
    • Series的索引和切片

    #索引操作
    s4[0]
    s4['数学']
    s4.数学
    
    # 值为
    1
    
    #切片
    s4[0:2]
    
    # 结果:
    数学    1
    英语    2
    dtype: int64
        
        
    s4["英语":'语文']
    
    # 结果:
    英语    2
    语文    3
    dtype: int64
    
    • Series的常用属性
      • shape --------- 查看维度
      • size --------- 查看长度
      • index --------- 查看所有的索引
      • values --------- 查看所有的值
    s4.shape
    (3,)
    
    s4.size
    3
    
    s4.index
    Index(['数学', '英语', '语文'], dtype='object')
    
    s4.values
    array([1, 2, 3], dtype=int64)
    
    • Series的常用方法
      • head(),tail()
      • unique()
      • isnull(),notnull()
      • add() sub() mul() div()
    s4.head(2) #显式前n条数据
    s4.tail(2) #显式后n条数据
    
    英语    2
    理综    3
    dtype: int64
    
    s = Series(data=[1,1,2,2,3,4,5,6,6,6,6,6,6,7,8])
    s.unique() #对Series进行去重
    
    array([1, 2, 3, 4, 5, 6, 7, 8], dtype=int64)
    
    • Series的算术运算
    s + s
    s.add(s)
    
    
    0      2
    1      2
    2      4
    3      4
    4      6
    5      8
    6     10
    7     12
    8     12
    9     12
    10    12
    11    12
    12    12
    13    14
    14    16
    dtype: int64
    
    • 算数运算的法则:
      • 索引与之匹配的值进行算数运算,否则补空
    s1 = Series(data=[1,2,3,4])
    s2 = Series(data=[5,6,7])
    s1 + s2
    
    # 结果:
    0     6.0
    1     8.0
    2    10.0
    3     NaN
    dtype: float64
    
    • 清洗Series中的空值
    s1 = Series(data=[1,2,3,4],index=['a','b','c','e'])
    s2 = Series(data=[1,2,3,4],index=['a','d','c','f'])
    s = s1 + s2
    
    a    2.0
    b    NaN
    c    6.0
    d    NaN
    e    NaN
    f    NaN
    dtype: float64
    
    #boolean可以作为索引取值
    s1[[True,False,True,False]]
    
    a    1
    c    3
    dtype: int64
    
    #把s的NAN进行了清洗
    s[[True,False,True,False,False,False]]
    
    a    2.0
    c    6.0
    dtype: float64
    
    • 将符合清洗要求的布尔值获取
    s = s1 + s2
    
    a    2.0
    b    NaN
    c    6.0
    d    NaN
    e    NaN
    f    NaN
    dtype: float64
    
    s.isnull()
    
    a    False
    b     True
    c    False
    d     True
    e     True
    f     True
    dtype: bool
    
    s.notnull()
    
    a     True
    b    False
    c     True
    d    False
    e    False
    f    False
    dtype: bool
    
    #NAN的清洗
    s[s.notnull()]
    
    a    2.0
    c    6.0
    dtype: float64
    

    DataFrame

    • DataFrame是一个【表格型】的数据结构。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。

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

      • ndarray创建
      • 字典创建
    df = DataFrame(data=np.random.randint(0,100,size=(5,6)))
    
    
    0 1 2 3 4 5
    0 65 84 20 21 82 75
    1 92 72 65 88 30 25
    2 40 7 28 6 56 70
    3 20 77 55 54 87 11
    4 89 95 50 22 55 93
    dic = {
        'name':['tom','jay','bobo'],
        'salary':[10000,15000,10000]
    }
    df = DataFrame(data=dic,index=['a','b','c'])
    
    
    name salary
    a tom 10000
    b jay 15000
    c bobo 10000
    • DataFrame的属性
      • values、columns、index、shape
    df.values      # 查看全部的值
    df.shape       # 查看结构
    df.index       # 查看列索引
    df.columns     # 查看行索引
    
    Index(['name', 'salary'], dtype='object')
    

    ============================================

    练习4:

    根据以下考试成绩表,创建一个DataFrame,命名为df:

        张三  李四  
    语文 150  0
    数学 150  0
    英语 150  0
    理综 300  0
    
    dic = {
        "张三":[150,150,150,300],
        "李四":[0,0,0,0]
    }
    
    df = DataFrame(data=dic,index=["语文","英语","数学","理综"])
    

    ============================================

    • DataFrame索引操作
      • 对行进行索引
      • 队列进行索引
      • 对元素进行索引
    name salary
    a tom 10000
    b jay 15000
    c bobo 10000
    #索引取单列
    df['name']
    
    a     tom
    b     jay
    c    bobo
    Name: name, dtype: object
    
    #索引取多列
    df[['salary','name']]
    
    salary name
    a 10000 tom
    b 15000 jay
    c 10000 bobo
    #取单行
    df.loc['a']
    df.iloc[0]
    
    name        tom
    salary    10000
    Name: a, dtype: object
    
    #取多行
    df.loc[['a','c']]
    df.iloc[[0,2]]
    
    name salary
    a tom 10000
    c bobo 10000
    df
    
    name salary
    a tom 10000
    b jay 15000
    c bobo 10000
    #取单个元素之
    df.iloc[1,1]
    df.loc['b','salary']
    
    15000
    
    #取多个元素值
    df.loc[['b','c'],'salary']
    df.iloc[[1,2],1]
    
    b    15000
    c    10000
    Name: salary, dtype: int64
    
    • DataFrame的切片操作
      • 对行进行切片
      • 对列进行切片
    df
    
    name salary
    a tom 10000
    b jay 15000
    c bobo 10000
    #切行
    df[0:2]
    
    name salary
    a tom 10000
    b jay 15000
    #切列
    df.iloc[:,0:2]
    
    name salary
    a tom 10000
    b jay 15000

    ============================================

    练习:

    1. 假设ddd是期中考试成绩,ddd2是期末考试成绩,请自由创建ddd2,并将其与ddd相加,求期中期末平均值。

      dic = {
          "ddd":[10,20,30],
          "dd2":[50,60,50]
      }
      
      df = DataFrame(data=dic,index=['a','b','c'])
      
      df.mean(axis=1)
      
    2. 假设张三期中考试数学被发现作弊,要记为0分,如何实现?

      dic = {
          "张三":[10,20,30],
      }
      
      df = DataFrame(data=dic,index=['语文','英语','数学'])
      df
      
      df.loc["数学"] = 0
      
      df
      
    3. 李四因为举报张三作弊立功,期中考试所有科目加100分,如何实现?

      dic = {
          "李四":[10,20,30],
      }
      
      df = DataFrame(data=dic,index=['语文','英语','数学'])
      df
      
      df['李四'] += 100
      df
      
    4. 后来老师发现有一道题出错了,为了安抚学生情绪,给每位学生每个科目都加10分,如何实现?

      dic = {
          "李四":[10,20,30],
          "张三":[10,20,0]
      }
      
      df = DataFrame(data=dic,index=['语文','英语','数学'])
      
      df += 10
      

    ============================================

    • 时间数据类型的转换
      • pd.to_datetime(col)
    • 将某一列设置为行索引
      • df.set_index()
    dic = {
        'time':['2019-01-09','2011-11-11','2018-09-22'],
        'salary':[1111,2222,3333]
    }
    df = DataFrame(data=dic)
    
    salary time
    0 1111 2019-01-09
    1 2222 2011-11-11
    2 3333 2018-09-22
    #查看df的数据的数据类型
    df.dtypes
    
    salary     int64
    time      object
    dtype: object
    
    #将time列转换成时间序列类型
    df['time'] = pd.to_datetime(df['time'])
    
    
    salary time
    0 1111 2019-01-09
    1 2222 2011-11-11
    2 3333 2018-09-22
    df.dtypes
    
    # 结果
    salary             int64
    time      datetime64[ns]
    dtype: object
    
    #将time这一列作为原数据的行索引
    df.set_index(df['time'],inplace=True)
    
    df.drop(labels='time',axis=1,inplace=True) #drop函数中axis的0行,1列
    
    salary
    time
    2019-01-09 1111
    2011-11-11 2222
    2018-09-22 3333
  • 相关阅读:
    HDU 5087 (线性DP+次大LIS)
    POJ 1064 (二分)
    Codeforces 176B (线性DP+字符串)
    POJ 3352 (边双连通分量)
    Codeforces 55D (数位DP+离散化+数论)
    POJ 2117 (割点+连通分量)
    POJ 1523 (割点+连通分量)
    POJ 3661 (线性DP)
    POJ 2955 (区间DP)
    LightOJ 1422 (区间DP)
  • 原文地址:https://www.cnblogs.com/zhufanyu/p/12026058.html
Copyright © 2020-2023  润新知