zoukankan      html  css  js  c++  java
  • Python数据分析-Pandas(Series与DataFrame)

    Pandas介绍:

      pandas是一个强大的Python数据分析的工具包,是基于NumPy构建的。

    Pandas的主要功能:
      1)具备对其功能的数据结构DataFrame、Series
      2)集成时间序列功能
      3)提供丰富的数学运算和操作
      4)灵活处理缺失数据

    python里面安装、引入方式:
      安装方法:pip install pandas
      引用方法:import pandas as pd

    Series数组的创建:

    创建空的的值

    import pandas as pd
    s = pd.Series()
    print(s)  #Series([], dtype: float64)

    传入一个列表

    data=['a','b','c','d']
    res=pd.Series(data)
    print(res)
    
    '''结果
    0    a
    1    b
    2    c
    3    d
    这里没有传递任何索引,因此默认情况下,它分配了从0到len(data)-1的索引,即:0到3
    '''

    传一个字典

    data = {'a' : 0, 'b' : 1, 'c' : 2}
    s = pd.Series(data)
    print(s)
    '''结果
    a    0
    b    1
    c    2
    dtype: int64
    
    注意 - 字典键用于构建索引。
    
    '''

    从标量创建索引:

    如果数据是标量值,则必须提供索引。将按照索引重复该值进行匹配

    res=pd.Series(0, index=['a','b','c','d'])
    print(res)
    
    '''结果
    a    0
    b    0
    c    0
    d    0
    
    '''

    自指定索引值:

    res=pd.Series(['a','b','c','d'],index=['a_index','b_index','c_index','d_index'])
    print(res)
    
    '''结果
    a_index    a
    b_index    b
    c_index    c
    d_index    d
    
    '''

    从具有位置的系列中访问数据(取值):

    重点理解:数组是从零开始计数的,第一个位置存储再零位置)

    查看index 、 values的值:

    #查看数组的index值
    print(res.index)
    
    #查看数组的value值
    print(res.values)
    
    
    #取值(根据默认第零位开始取)
    print(res[0])  #a

    取前三个值(不包括定义的最后一个数值)

    res=pd.Series(['a','b','c','d'],index=['a_index','b_index','c_index','d_index'])
    
    #取前三个值(不包括3)
    print(res[:3]) #是个对象可以 res[:3].values
    '''结果

      a_index a
      b_index b
      c_index c
      dtype: object

    '''

    取后三个值:

    print(res[-3:])
    
    '''结果
    b_index    b
    c_index    c
    d_index    d
    dtype: object
    
    '''

    使用索引标签检索数据并设置数据:

    修改value值

    res=pd.Series(['a','b','c','d'],index=['a_index','b_index','c_index','d_index'])
    print(res)
    res['a_index']='new_a'
    print(res)
    
    '''结果
    
    a_index    new_a
    b_index        b
    c_index        c
    d_index        d
    
    '''

    copy复制数据并修改

    sr1=pd.Series([12,13,14],index=['c','a','d'])
    sr2=pd.Series([14,15,16],index=['d','c','a'])
    
    #可以使用copy赋值数组再修改
    sr3=sr1[1:].copy()
    print(sr3)
    
    sr3[0]=1888
    print(sr3)
    
    '''
    a    13
    d    14
    dtype: int64
    
    a    1888
    d      14
    dtype: int64
    '''

    运算:

    初始构建2个数组

    sr1=pd.Series([12,13,14],index=['c','a','d'])
    
    sr2=pd.Series([14,15,16],index=['d','c','a'])
    
    print(sr1+sr2)
    '''结果
    a    29
    c    27
    d    28
    
    
    ''' 

    求和运算

    Pandas自动对齐功能,如果自定义了索引就会找原来索引,如果没有值就为NaN

    sr1=pd.Series([12,13,14],index=['c','a','d'])
    sr3=pd.Series([11,20,10,14], index=['d','c','a','b'])
    print(sr3)
    #求sr1+sr3和值
    print(sr1+sr3)
    '''结果
    
    a    23.0
    b     NaN  #一位sr1中没有索引b,所以显示空
    c    32.0
    d    25.0
    
    Pandas自动对齐功能,如果自定义了索引就会找原来索引,如果没有值就为NaN
    
    '''

    针对Seires格式的数据,Pandas对其NaN值的处理如下:

    #先构建一个缺失数据
    sr1=pd.Series([12,13,14],index=['c','a','d'])
    sr2=pd.Series([14,15,16],index=['d','c','a'])
    
    sr3=pd.Series([11,20,10,14], index=['d','c','a','b'])
    
    #合并生成一个缺失数据
    sr4=sr1+sr3
    print(sr4)
    
    '''结果
    
    a    23.0
    b     NaN
    c    32.0
    d    25.0
    dtype: float64
    
    '''

    第一步:格式为 pd.isnull(Series对象),isnull、notnull用于过滤、查找NaN的值

    isnull,返回布尔数组,缺失值对应True

    #isnull,返回布尔数组,缺失值对应True
    res=pd.isnull(sr4)
    print(res)
    
    '''结果
    a    False
    b     True
    c    False
    d    False
    
    '''

    notnull,返回布尔数组,缺失值对应为False

    #notnull,返回布尔数组,缺失值对应为False
    res=pd.notnull(sr4)
    print(res)
    '''结果
    a     True
    b    False
    c     True
    d     True
    dtype: bool
    
    '''

    第二步:格式为 pd.Series.dropna(series对象)删除有NaN的行注意对于Series的数据格式使用dropna必须是

    pd.Series.dropna(sr4)这个格式,不能使用pd.dropna()这个是无效的,

    dropna,删除NaN的(因为是Series数据格式只有行的概念)

    #dropna,过滤掉有NaN的行
    res=pd.Series.dropna(sr4)
    print(res)
    
    '''
    a    23.0
    c    32.0
    d    25.0
    dtype: float64
    
    '''

    第三步:格式为 Series对象.fillna(‘要填充为的数据内容’)

    fillna,填充缺失的数据

    #fillna,填充NaN缺失的数据
    res=sr4.fillna('这是给NaN做填充的数据')
    print(res)
    
    '''数据结构
    a              23
    b    这是给NaN做填充的数据
    c              32
    d              25
    dtype: object
    
    '''

    DataFrame数组创建

    DataFrame是个二维数据结构,非常接近电子表格或者类似于mysql数据库的形式,是一个表格型的数据结构,含有一组有序的列。
    DataFrame可以被看做是由Series组成的字典,并且共用一个索引。

    创建数组

    简单方式

    data={'name':['google','baidu','yahho'],'marks':[100,200,300],'price':[1,2,3]}
    res=DataFrame(data)
    print(res)
    
    '''结果(默认索引是0开始)
    
         name  marks  price
    0  google    100      1
    1   baidu    200      2
    2   yahho    300      3
    
    '''

    补充,与Series结合方式

    #与Series结合的方式
    res=pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']), 'two':pd.Series([1,2,3,4],index=['b','a','c','d'])})
    print(res)
    
    '''结果
       one  two
    a  1.0    2
    b  2.0    1
    c  3.0    3
    d  NaN    4
    
    '''

    数组属性、方法

      1)index 获取索引
      2)T 转置
      3)columns 获取列索引
      4)values 获取值数组
      5)  describe() 获取快速统计
      6)sort_index(axis, …, ascending) 按行或列索引排序
      7)sort_values(by, axis, ascending) 按值排序

    data = {"name": ['google', 'baidu', 'yahoo'], "marks": [100, 200, 300], "price": [1, 2, 3]}
    res=DataFrame(data)
    print(res)
    ''' 依此来进行下面查询方法的验证
         name  marks  price
    0  google    100      1
    1   baidu    200      2
    2   yahoo    300      3
    
    '''

    index获取索引

    #index,查看索引
    print(res.index)    #RangeIndex(start=0, stop=3, step=1)

    columns查看列索引

    #columns,查看列索引
    print(res.columns)   #Index(['name', 'marks', 'price'], dtype='object')

    values获取数组值

    #values,查看值数组
    print(res.values)
    
    '''结果
    
    [['google' 100 1]
     ['baidu' 200 2]
     ['yahoo' 300 3]]
     
    '''

    describe(),获取快速统计

    #describe(),获取快速统计
    # print(res.describe())
    '''
         marks  price
    count    3.0    3.0
    mean   200.0    2.0
    std    100.0    1.0
    min    100.0    1.0
    25%    150.0    1.5
    50%    200.0    2.0
    75%    250.0    2.5
    max    300.0    3.0
    
    '''

    sort_index(),按行或列索引排序

    参数说明axis=0/1 ascending=True升序/降序默认是True

    #axis=0,按照行索引排序
    res=res.sort_index(axis=0)
    print(res)
    
    '''索引排序结果
         name  marks  price
    0  google    100      1
    1   baidu    200      2
    2   yahoo    300      3
    '''
    
    
    #axis=1,按照列索引排序
    res=res.sort_index(axis=1,ascending=True)
    print(res)
    '''列索引排序结果
       marks    name  price
    0    100  google      1
    1    200   baidu      2
    2    300   yahoo      3
    
    '''

    sort_values( by,axis,ascending ) 按值排序

    #sort_values(by,axis,ascending) 按值排序
    data = {"name": ['google', 'baidu', 'yahoo'], "marks": [100, 200, 300], "price": [1, 2, 3]}
    res=DataFrame(data)
    res=res.sort_values(by=['name'],axis=0) #这里的axis只能是0,每一列的数值就是根据每个数值的大小顺序上下浮动排序的,参照的就是逐行去对比
    print(res)
    
    '''按照值排序结果
         name  marks  price
    1   baidu    200      2
    0  google    100      1
    2   yahoo    300      3
    
    '''

    手动指定索引值

    #手动指定索引值
    res=DataFrame(data,columns=['name','marks','price',],index=['第一','第二','第三'])
    print(res)
    
    '''结果
    
          name  marks  price
    第一  google    100      1
    第二   baidu    200      2
    第三   yahho    300      3
    
    '''

    取值(有行索引和列索引)

    获取单列数据,例如获取name标签列数据

    #获取单列
    #1.获取名字标签列
    res=DataFrame(data,columns=['name','marks','price',],index=['第一','第二','第三'])
    res=res['name']
    print(res)
    
    '''结果
    
    第一    google
    第二     baidu
    第三     yahho
    Name: name, dtype: object
    
    '''

    获取price标签列数据

    #2.获取价格标签列
    # res=res['price']
    # print(res)
    '''
    第一    1
    第二    2
    第三    3
    Name: price, dtype: int64
    
    '''

    获取双列数据

    同时获取2个标签(注意:同时获取两个标签时要双中括号引起来)

    #同时获取2个标签(注意:同时获取两个标签时要双中括号引起来)
    res=res[['name','price']]
    print(res)
    
    '''结果
          name  price
    第一  google      1
    第二   baidu      2
    第三   yahho      3
    
    '''

    获取数据中单个值

    #先从单列里面取第一列,再从取出的列中取出第一个值
    res=res['name'][0]
    print(res)  #google

    取前两行值

    #先取前2行
    res=res[0:2]
    print(res)
    '''
          name  marks  price
    第一  google    100      1
    第二   baidu    200      2
    '''

    取前两行值后再从中取指定列

    #先取前2行--再从中取指定列
    res=res[0:2][['name','price']]
    print(res)
    
    '''结果:注意,取多个标签时要双括号
          name  price
    第一  google      1
    第二   baidu      2
    
    '''

    ix ,可以兼容下面loc、iloc用法,它可以根据行列标签又可以根据行列数,例如下面的(参数前:行索引 后:列索引

    import pandas as pd
    data = pd.DataFrame({'A':[1,2,3],'B':[4,5,6],'C':[7,8,9]},index=["a","b","c"])
    data
    
        A   B   C
    a   1   4   7
    b   2   5   8
    c   3   6   9
    :本文为博主原创文章,转载请附上博文链接!

    比如要拿到5

    方法1

    data.ix[1,1]
    
    data.ix['b':'c','B':'C']

    方法2

    data.ix[1:3,1:3]
    data.ix['b':'c','B':'C']

    loc,通过标签获取列

    指定取某几个标签

    #指定取某几个标签
    res=DataFrame(data,columns=['name','marks','price',],index=['第一','第二','第三'])
    res=res.loc[:,['name','marks']]
    print(res)
    '''
          name  marks
    第一  google    100
    第二   baidu    200
    第三   yahho    300
    '''

    取指定范围内的标签

    #取指定范围内的标签
    res=res.loc[:,'name':'price']
    print(res)
    '''
          name  marks  price
    第一  google    100      1
    第二   baidu    200      2
    第三   yahho    300      3
    
    '''

    索引+标签取值

    #索引+标签取值
    data = {"name": ['google', 'baidu', 'yahoo'], "marks": [100, 200, 300], "price": [1, 2, 3]}
    res=DataFrame(data)
    print(res)
    
    '''初始结果
         name  marks  price
    0  google    100      1
    1   baidu    200      2
    2   yahoo    300      3
    
    '''
    
    #搭配取值写法
    res=res.loc[0,['name']]
    print(res)
    
    '''结果
    
    name    google
    Name: 0, dtype: object
    
    '''

    根据索引、标签范围配合取值(注意,0:1包含了1

    #根据索引、标签范围配合取值(注意,0:1包含了1)
    res=res.loc[0:1,['marks','price']]
    print(res)
    
    '''结果
    
       marks  price
    0    100      1
    1    200      2
    
    '''

    iloc通过位置获取行数据

    获取单行数据

    data = {"name": ['google', 'baidu', 'yahoo'], "marks": [100, 200, 300], "price": [1, 2, 3]}
    res=DataFrame(data)
    print(res)
    '''初始状态
         name  marks  price
    0  google    100      1
    1   baidu    200      2
    2   yahoo    300      3
    
    '''
    
    #获第一行数据
    res=res.iloc[0]
    print(res)
    
    '''结果
    
    name     google
    marks       100
    price         1
    Name: 0, dtype: object
    
    '''

    获取多行数据

    #获取多行数据
    data = {"name": ['google', 'baidu', 'yahoo'], "marks": [100, 200, 300], "price": [1, 2, 3]}
    res=DataFrame(data)
    print(res.iloc[1]) # 先取到第2行: 1   baidu    200      2
    
    res=res.iloc[1,2]  #res.iloc[1,2]再在得到的行上再根据索引取值
    print(res)  #200

    获取行和列(根据范围取值,注意前提还用默认索引)

    #取行和列(根据范围来取)
    res=res.iloc[0:2,0:2]
    print(res)
    '''结果
         name  marks   1.先取前2行【0:2】即取0,1索引行
    0  google    100   2.在1的基础上再取前2列【0,2】即取列索引为0,1
    1   baidu    200
    
    '''

    取2、3行,然后打印这两行所有列的数据

    res=res.iloc[1:3,:]
    print(res)
    
    '''结果
        name  marks  price
    1  baidu    200      2
    2  yahoo    300      3
    
    '''

    取1、2行,然后单一显示它的第1、3列

    #取第1、2行,然后打印显示它的第1、3列
    res=res.iloc[[0,1],[0,2]]
    print(res)
    
    '''结果
         name  price
    0  google      1
    1   baidu      2
    
    '''
  • 相关阅读:
    go笔记 (异或交换两个数字变量需要注意的问题)
    java子线程中获取父线程的threadLocal中的值
    关于java线程池的线程废弃与存活条件分析
    .net实现上传图片到共享目录(远程服务器)
    .net 获取两个时间段中间的日期
    ASP .NET数据写入oracle数据库
    MySql定时插入数据
    Sitecore8.2 .net Solr搜索实现
    .net 盘古分词
    json_3层格式_数据源DataSet
  • 原文地址:https://www.cnblogs.com/yangzhizong/p/10074583.html
Copyright © 2011-2022 走看看