zoukankan      html  css  js  c++  java
  • Pandas之数据结构

    pandas入门

    由于最近公司要求做数据分析,pandas每天必用,只能先跳过numpy的学习,先学习大Pandas库
    Pandas是基于Numpy构建的,让以Numpy为中心的应用变得更加简单

    pandas的数据结构介绍

    • Series

      • 由一组数据以及一组数据标签即索引组成
      import pandas as pd
      from pandas import Series,DataFrame
      
      obj = Series([4,7,-5,3])
      # 索引在左边,值在右边,默认从0开始
      obj
      0    4
      1    7
      2   -5
      3    3
      dtype: int64
      
      
      # 制定索引
      obj2 = Series([4,7,-5,3],index = ['a','b','c','d'])
      obj2
      a    4
      b    7
      c   -5
      d    3
      dtype: int64
      # 查看索引
      obj2.index
      Index(['a', 'b', 'c', 'd'], dtype='object')
      
      # 查询
      obj2[['a','b','c']]
      a    4
      b    7
      c   -5
      dtype: int64
      
      obj2[obj2>0]
      a    4
      b    7
      d    3
      dtype: int64
      
      • 还可以直接看成一个关系型字典
      sdata = {'ke':35000,'text':70000,'orgen':16000}
      obj3 = Series(sdata)
      obj3
      
      ke       35000
      text     70000
      orgen    16000
      dtype: int64
      
      keys = ['ke','text','orgen','xu']
      obj4 = Series(sdata, index=keys)
      obj4
      ke       35000.0
      text     70000.0
      orgen    16000.0
      xu           NaN
      dtype: float64
      
      • 检测缺失值的重要两个函数 isnull和notnull
      obj4[obj4.isnull()]
      xu   NaN
      dtype: float64
      
      obj4[obj4.notnull()]
      ke       35000.0
      text     70000.0
      orgen    16000.0
      dtype: float64
      
      • Series本身和索引都有一个name属性
      # 可以理解成对象名称
      obj4.name = 'pop'
      # 对象的索引的名称
      obj4.index.name = 'state'
      obj4
      
      state
      ke       35000.0
      text     70000.0
      orgen    16000.0
      xu           NaN
      Name: pop, dtype: float64
      
      # Series的索引可以就地修改
      obj4.index = ['new_ke','new_text','new_orgen','new_xu']
      new_ke       35000.0
      new_text     70000.0
      new_orgen    16000.0
      new_xu           NaN
      Name: pop, dtype: float64
      
    • DataFrame

      • DataFrame是一个表格型数据结构,最常用的是直接传入一个由等长列表或者是Numpy数组组成的字典
      data = {'state':['oh','oh','vad','vad'],
              'yead':[2000,2001,2002,2003],
              'pop':[1.5,1.7,3.6,2.4]
          }
      
      frame = DataFrame(data)
      # 自动有序排列
      	yead	state	pop
      0	2000	oh	1.5
      1	2001	oh	1.7
      2	2002	vad	3.6
      3	2003	vad	2.4
      
      # 如果传入的列在数据中找不到,就产生NaN
      DataFrame(data,columns=['yar','yead'])
      	yar	yead
      0	NaN	2000
      1	NaN	2001
      2	NaN	2002
      3	NaN	2003
      

    通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series

    data = {'state':['oh','oh','vad','vad'],
            'years':[2000,2001,2002,2003],
            'pop':[1.5,1.7,3.6,2.4]
        }
    frame2 = pd.DataFrame(data,columns=['years','state','pop'])
    
    # 原地修改索引
    frame2.index=['one','two','three','four']
    frame2
    
    	years	state	pop
    one	2000	oh	1.5
    two	2001	oh	1.7
    three	2002	vad	3.6
    four	2003	vad	2.4
    
    frame2.columns
    Index(['years', 'state', 'pop'], dtype='object')
    
    # 通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series
    # 字典操作
    series_=frame2['state']
    series_
    
    one       oh
    two       oh
    three    vad
    four     vad
    Name: state, dtype: object
    
    # 对象操作
    frame2.years
    
    one      2000
    two      2001
    three    2002
    four     2003
    Name: years, dtype: int64
    
    # 查看具体一行的数据
    frame2.ix['three']
    
    years    2002
    state     vad
    pop       3.6
    Name: three, dtype: object
    
    # 修改具体一列的数
    frame2['new_raw']=16.5
    frame2
    
    years	state	pop	new_raw
    one	2000	oh	1.5	16.5
    two	2001	oh	1.7	16.5
    three	2002	vad	3.6	16.5
    four	2003	vad	2.4	16.5
    

    将列表或数组赋值给某个列时,其长度必须跟DataFrame的长度相匹配,否则自动填充空值

    from pandas import Series
    val = Series([-1.2,-1.5,-1.7], index=['two','four','five'])
    frame2['new_raw'] = val
    frame2
    
    years	state	pop	new_raw
    one	2000	oh	1.5	NaN
    two	2001	oh	1.7	-1.2
    three	2002	vad	3.6	NaN
    four	2003	vad	2.4	-1.5
    

    删除列

    # 为不存在的列赋值
    frame2['eastern'] = frame2.state == 'oooo'
    frame2
    
    years	state	pop	new_raw	eastern
    one	2000	oh	1.5	NaN	False
    two	2001	oh	1.7	-1.2	False
    three	2002	vad	3.6	NaN	False
    four	2003	vad	2.4	-1.5	False
    
    del frame2['eastern']
    
    frame2.columns
    Index(['years', 'state', 'pop', 'new_raw'], dtype='object')
    

    警告:通过索引方式返回的列只是相应数据的视图而已,并不是副本,对返回的Series所做的任何就地修改都会反映到源数据上,可以通过Series的copy方法显示的复制列

    嵌套字典 外层字典的键作为列,内层键作为行索引

    pop = {'Nevada':{2001:2.4,2002:2.9},
              'Ohio':{2000:1.5,2001:1.7,2002:3.6}
          }
    frame3=pd.DataFrame(pop)
    frame3
    	Nevada	Ohio
    2000	NaN	1.5
    2001	2.4	1.7
    2002	2.9	3.6
    

    转置

    frame3.T
    2000	2001	2002
    Nevada	NaN	2.4	2.9
    Ohio	1.5	1.7	3.6
    
    # 内层字典的键会被合并、排序以形成最终的索引,如果显示指定了索引,就不会这样
    frame3.reindex(index=[2001,2002,2000])
    Nevada	Ohio
    2001	2.4	1.7
    2002	2.9	3.6
    2000	NaN	1.5
    

    DataFrame构造函数所能接受的各种数据

    类型 说明
    二维ndarry 数据矩阵
    由数组、列表或元组组成的字典 每个序列变成DataFrame的一列。所有序列的长度必须相同
    Numpy结构化/记录数组 类似于由数组组成的字典
    由Series组成的子典 每个Series会成为一列
    由字典组成的字典 各内层字典会成为一列
    字典或Series的列表 各项将会成为DataFrame的一行。
    由列表或元组组成的列表 类似于'二维ndarray'
    另一个DataFrame 该DataFrame的索引将会被沿用,除非显示指定了其他索引
    Numpy的maskedArray 类似于'二维ndarray'的情况
    如果设置了DataFrame的index和columns的name属性,则这些信息也会被显示出来
    frame3.index.name='year'
    frame3.columns.name = 'state'
    frame3
    
    state	Nevada	Ohio
    year		
    2000	NaN	1.5
    2001	2.4	1.7
    2002	2.9	3.6
    

    values属性返回一个二维ndarray的形式

    frame3.values
    
    array([[nan, 1.5],
           [2.4, 1.7],
           [2.9, 3.6]])
    

    如果各列的数据类型不同,则会选用能兼容所有列的数据类型

    frame2.values
    
    array([[2000, 'oh', 1.5, nan],
           [2001, 'oh', 1.7, -1.2],
           [2002, 'vad', 3.6, nan],
           [2003, 'vad', 2.4, -1.5]], dtype=object)
    

    索引对象

    pandas的索引对象负责管理轴标签和其他元数据比如轴名称等,构建Series或DataFrame时,所用到的任何数组或其他序列的标签都会被转换成一个Index

    obj = Series(range(3), index=['a','b','c'])
    obj.index
    Index(['a', 'b', 'c'], dtype='object')
    
    obj.index[:1]
    Index(['a'], dtype='object')
    

    index对象是不可修改的,这样子才能index对象在多个数据结构之间安全共享

    obj.index[0] = '5'
    
    TypeError                                 Traceback (most recent call last)
    <ipython-input-24-61511960448d> in <module>()
    ----> 1 obj.index[0] = '5'
    
    E:anaconda3libsite-packagespandascoreindexesase.py in __setitem__(self, key, value)
       2063 
       2064     def __setitem__(self, key, value):
    -> 2065         raise TypeError("Index does not support mutable operations")
       2066 
       2067     def __getitem__(self, key):
    
    TypeError: Index does not support mutable operations
    

    index的继承

    import numpy as np
    index = pd.Index(np.arange(3))
    index
    Int64Index([0, 1, 2], dtype='int64')
    
    obj2 = Series([1.5,-2.5,0], index = index)
    obj2
    
    0    1.5
    1   -2.5
    2    0.0
    dtype: float64
    
    obj2.index is index
    True
    

    pandas中主要的Index对象

    说明
    Index 将轴标签表示为一个由Python对象组成的Numpy数组
    Int64Index 针对整数的特殊Index
    MultiIndex '层次化'索引对象,表示单个轴上的多次索引
    DatetimeIndex 存储纳秒级时间戳
    PeriodIndex 针对Period数据的特殊Index
    frame3
    state	Nevada	Ohio
    year		
    2000	NaN	1.5
    2001	2.4	1.7
    2002	2.9	3.6
    
    2000 in frame3.index
    True
    'Ohio' in frame3.columns
    True
    

    每个索引都有一些方法和属性

    方法 说明
    append 连接另一个index对象,产生新的index
    diff 计算差集,并得到一个index
    intersection 计算交集
    union 计算并集
    isin 计算y一个指示值是否都包含在参数集合中的布尔型数组
    delete 删除索引i处的元素,并得到新的index
    drop 将元素插入到索引i处,并得到新的index
    insert 当各元素均大于等于前一个元素时,返回True
    is_monotonic 当index没有重复值时,返回True
    is_unique 当index没有重复值时,返回True
    unique 计算index中唯一值的数组
  • 相关阅读:
    初步掌握HBase
    基于HBase0.98.13搭建HBase HA分布式集群
    获取当前目录中的文件个数
    MapReduce链接作业
    MapReduce二次排序
    使用map端连接结合分布式缓存机制实现Join算法
    字符串匹配算法-BM
    统计电视机顶盒中无效用户数据,并以压缩格式输出有效用户数据
    字符串匹配算法-KMP
    MapReduce中的Join算法
  • 原文地址:https://www.cnblogs.com/lishi-jie/p/9874102.html
Copyright © 2011-2022 走看看