python-pandas之Index数据分析(六)
        【摘要】 
                    python-pandas之Index数据分析(六) 
索引对象 
'''数据结构 索引对象• pandas的索引对象负责管理轴标签和其他元数据(比如轴名称等)。构建Series或DataFrame时,所用到的任何数组或其他序列的标签都会被转换成一个Index。• Index对象是不可修改的(immutable),因此用户不能对其进行修...
    
    
    
    python-pandas之Index数据分析(六)
索引对象
  
   - 
    
     
    
    
     
      '''
     
    
- 
    
     
    
    
     
      数据结构 索引对象
     
    
- 
    
     
    
    
     
      • pandas的索引对象负责管理轴标签和其他元数据(比如轴名称等)。构建
     
    
- 
    
     
    
    
     
      Series或DataFrame时,所用到的任何数组或其他序列的标签都会被转换成一
     
    
- 
    
     
    
    
     
      个Index。
     
    
- 
    
     
    
    
     
      • Index对象是不可修改的(immutable),因此用户不能对其进行修改。不可
     
    
- 
    
     
    
    
     
      修改性非常重要,因为这样才能使Index对象在多个数据结构之间安全共享。
     
    
- 
    
     
    
    
     
      
     
    
- 
    
     
    
    
     
      • pandas中主要的index对象
     
    
- 
    
     
    
    
     
      类型 说明
     
    
- 
    
     
    
    
     
      index 最泛化的Index对象,将轴标签为一个由Python对象组成的NumPy数组。
     
    
- 
    
     
    
    
     
      Int64Index 针对整数的特殊Index
     
    
- 
    
     
    
    
     
      MultiIndex “层次化”索引对象,表示单个轴上的多层索引。可以看做由园数组组成的数
     
    
- 
    
     
    
    
     
      组。
     
    
- 
    
     
    
    
     
      DatetimeIndex 存储纳秒级时间戳
     
    
- 
    
     
    
    
     
      PeriodIndex 针对Period数据的特殊Index
     
    
- 
    
     
    
    
     
      
     
    
- 
    
     
    
    
     
      • Index的方法和属性 I
     
    
- 
    
     
    
    
     
      类型 说明
     
    
- 
    
     
    
    
     
      append append 连接另一个Index对象,产生一个新的Index。
     
    
- 
    
     
    
    
     
      diff 计算差集,并得到一个Index。
     
    
- 
    
     
    
    
     
      intersection 计算交集
     
    
- 
    
     
    
    
     
      union 计算并集
     
    
- 
    
     
    
    
     
      isin 计算一个指示各值是否包含在参数集合中的布尔型数组
     
    
- 
    
     
    
    
     
      delete 删除索引i处的元素,并得到新的Index。
     
    
- 
    
     
    
    
     
      
     
    
- 
    
     
    
    
     
      • Index的方法和属性 II
     
    
- 
    
     
    
    
     
      类型 说明
     
    
- 
    
     
    
    
     
      drop 删除传入的值,并得到新的索引。
     
    
- 
    
     
    
    
     
      insert 将元素插入到索引i处,并得到新的Index。
     
    
- 
    
     
    
    
     
      is_monotonic 当各元素均大于等于前一个元素时,返回True。
     
    
- 
    
     
    
    
     
      is_unique 当Index没有重复值时,返回True。
     
    
- 
    
     
    
    
     
      unique 计算Index中唯一值得数组
     
    
- 
    
     
    
    
     
      '''
     
    
- 
    
     
    
    
     
      import numpy as np
     
    
- 
    
     
    
    
     
      import pandas as pd
     
    
- 
    
     
    
    
     
      import sys
     
    
- 
    
     
    
    
     
      from pandas import  Series,DataFrame,Index
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      print('获取index')
     
    
- 
    
     
    
    
     
      obj = Series(range(3),index=['a','b','c'])
     
    
- 
    
     
    
    
     
      index = obj.index
     
    
- 
    
     
    
    
     
      print(index[1:]) #打印index从1开始的所有索引
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      try:
     
    
- 
    
     
    
    
     
          index[1] = 'd'  #Index对象是不可修改的(immutable),因此用户不能对其进行修改。不
     
    
- 
    
     
    
    
     
      except:
     
    
- 
    
     
    
    
         print
     
    
- 
    
     
    
    
         print(sys.exc_info()[0])
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      print('Index对象')
     
    
- 
    
     
    
    
     
      index = Index(np.arange(3))
     
    
- 
    
     
    
    
     
      obj2 = Series([1.6,23.3,6],index= index)
     
    
- 
    
     
    
    
     
      print(obj2)
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      print('判断列和索引是否存在')
     
    
- 
    
     
    
    
     
      pop = {'Nevada':{20001:2.4, 2002:2.9},
     
    
- 
    
     
    
    
             'Ohio':{2000:1.5, 2001:1.7, 2002:3.6}}
     
    
- 
    
     
    
    
     
      frame3 = DataFrame(pop)
     
    
- 
    
     
    
    
     
      print(frame3)
     
    
- 
    
     
    
    
     
      print('Ohio'in frame3.columns)  # True
     
    
- 
    
     
    
    
     
      print('3923' in frame3.index)   # False
     
    
 
重新索引
  
   - 
    
     
    
    
     
      '''
     
    
- 
    
     
    
    
     
      基本功能 重新索引
     
    
- 
    
     
    
    
     
      • 创建一个适应新索引的新对象,该Series的reindex将会根据新索引进行重排。
     
    
- 
    
     
    
    
     
      如果某个索引值当前不存在,就引入缺失值
     
    
- 
    
     
    
    
     
      • 对于时间序列这样的有序数据,重新索引时可能需要做一些插值处理。
     
    
- 
    
     
    
    
     
      method选项即可达到此目的。
     
    
- 
    
     
    
    
     
      
     
    
- 
    
     
    
    
     
      • reindex函数的参数
     
    
- 
    
     
    
    
     
      类型 说明
     
    
- 
    
     
    
    
     
      index 用作索引的新序列。既可以是Index实例,也可以是其它序列型的Python数据
     
    
- 
    
     
    
    
     
      结构。Index会被完全使用,就像没有任何复制一样。
     
    
- 
    
     
    
    
     
      method 插值填充方式,ffill或bfill。
     
    
- 
    
     
    
    
     
      fill_value 在重新索引过程中,需要引入缺失值时使用的替代值。
     
    
- 
    
     
    
    
     
      limit 前向或后向填充时的最大填充量
     
    
- 
    
     
    
    
     
      level 在MultiIndex的指定级别上匹配简单索引,否则选取其子集。
     
    
- 
    
     
    
    
     
      copy 默认为True,无论如何都复制。如果为False,则新旧相等就不复制。
     
    
- 
    
     
    
    
     
      '''
     
    
- 
    
     
    
    
     
      import numpy as np
     
    
- 
    
     
    
    
     
      from pandas import  DataFrame,Series
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      print('重新指定索引及顺序')
     
    
- 
    
     
    
    
     
      obj = Series([3.4,5.4,5.6,-4],index=['d', 'b', 'a', 'c'])
     
    
- 
    
     
    
    
     
      print(obj)
     
    
- 
    
     
    
    
     
      obj2 = obj.reindex(['a', 'b', 'd', 'c', 'e'])
     
    
- 
    
     
    
    
     
      print('重新指定索引obj2\n',obj2)
     
    
- 
    
     
    
    
     
      print('指定不存在元素的默认值')
     
    
- 
    
     
    
    
     
      print(obj.reindex(['a', 'b', 'd', 'c', 'e'], fill_value = 0))  # 指定不存在元素的默认值
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      print('重新指定索引并指定填元素充方法')
     
    
- 
    
     
    
    
     
      obj3 = Series(['libai','dufu','tangshi'],index=[0,2,4])
     
    
- 
    
     
    
    
     
      print(obj3)
     
    
- 
    
     
    
    
     
      print(obj3.reindex(range(6),method='ffill'))    #method 插值填充方式,ffill或bfill。
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      print('对DataFrame重新指定索引')
     
    
- 
    
     
    
    
     
      frame = DataFrame(np.arange(9).reshape(3, 3),
     
    
- 
    
     
    
    
     
                        index = ['a', 'c', 'd'],
     
    
- 
    
     
    
    
     
                        columns = ['Ohio', 'Texas', 'California'])
     
    
- 
    
     
    
    
     
      print(frame)
     
    
- 
    
     
    
    
     
      frame2 = frame.reindex(['a', 'b', 'c', 'd'])
     
    
- 
    
     
    
    
     
      print(frame2)
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      print('重新指定column')
     
    
- 
    
     
    
    
     
      states = ['Texas', 'Utah', 'California']
     
    
- 
    
     
    
    
     
      print(frame.reindex(columns = states))
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      print('对DataFrame重新指定索引并指定填元素充方法')
     
    
- 
    
     
    
    
     
      print(frame.reindex(index = ['a', 'b', 'c','d'],
     
    
- 
    
     
    
    
                         # method='ffill',
     
    
- 
    
     
    
    
     
                          columns = states))
     
    
- 
    
     
    
    
     
      print(frame.ix[['a', 'b', 'd', 'c'], states])
     
    
 
删除索引上的值
  
   - 
    
     
    
    
     
      '''
     
    
- 
    
     
    
    
     
      基本功能 丢弃指定轴上的项
     
    
- 
    
     
    
    
     
      • 丢弃某条轴上的一个或多个项很简单,只要有一个索引数组或列表即可。由于
     
    
- 
    
     
    
    
     
      需要执行一些数据整理和集合逻辑,所以drop方法返回的是一个在指定轴上删
     
    
- 
    
     
    
    
     
      除了指定值的新对象
     
    
- 
    
     
    
    
     
      '''
     
    
- 
    
     
    
    
     
      import numpy as np
     
    
- 
    
     
    
    
     
      from pandas import Series,DataFrame
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      print('Series根据索引删除元素')
     
    
- 
    
     
    
    
     
      obj = Series(np.arange(5),index=['a','b','c','d','e'])
     
    
- 
    
     
    
    
     
      obj2 = obj.drop('c')
     
    
- 
    
     
    
    
     
      print(obj2) #删除C索引对应的值
     
    
- 
    
     
    
    
     
      print(obj.drop(['d','e']))
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      print('DataFrame删除元素,可指定索引或列。')
     
    
- 
    
     
    
    
     
      data = DataFrame(np.arange(16).reshape((4,4)),
     
    
- 
    
     
    
    
     
                       index=['A','B','C','D'],
     
    
- 
    
     
    
    
     
                       columns=['N1','N2','N3','N4'])
     
    
- 
    
     
    
    
     
      print(data)
     
    
- 
    
     
    
    
     
      print('删除A行的元素')
     
    
- 
    
     
    
    
     
      print(data.drop('A'))
     
    
- 
    
     
    
    
     
      print('删除N1列的元素')
     
    
- 
    
     
    
    
     
      print(data.drop('N1',axis=1))
     
    
- 
    
     
    
    
     
      print(data.drop(['N1','N3'],axis=1))
     
    
 
索引、选取和过滤
  
   - 
    
     
    
    
     
      '''
     
    
- 
    
     
    
    
     
      基本功能 索引、选取和过滤
     
    
- 
    
     
    
    
     
      • Series索引(obj[...])的工作方式类似于NumPy数组的索引,只不过Series的
     
    
- 
    
     
    
    
     
      索引值不只是整数。
     
    
- 
    
     
    
    
     
      • 利用标签的切片运算与普通的Python切片运算不同,其末端是包含的
     
    
- 
    
     
    
    
     
      (inclusive)。
     
    
- 
    
     
    
    
     
      • 对DataFrame进行索引其实就是获取一个或多个列
     
    
- 
    
     
    
    
     
      • 为了在DataFrame的行上进行标签索引,引入了专门的索引字段ix。
     
    
- 
    
     
    
    
     
      
     
    
- 
    
     
    
    
     
      • DataFrame的索引选项
     
    
- 
    
     
    
    
     
      类型 说明
     
    
- 
    
     
    
    
     
      obj[val] 选取DataFrame的单个列或一组列。在一些特殊情况下会比较便利:布尔型数组(过滤
     
    
- 
    
     
    
    
     
      行)、切片(行切片)、布尔型DataFrame(根据条件设置值)。
     
    
- 
    
     
    
    
     
      obj.ix[val] 选取DataFrame的单个行或一组行
     
    
- 
    
     
    
    
     
      obj.ix[:, val] 选取单个列或列子集
     
    
- 
    
     
    
    
     
      obj.ix[val1, val] 同时选取行或列
     
    
- 
    
     
    
    
     
      reindex方法 将一个或多个轴匹配到新索引
     
    
- 
    
     
    
    
     
      xs方法 根据标签选取单行或单列,并返回一个Series。
     
    
- 
    
     
    
    
     
      icol、irow方法 根据整数位置选取单行或单列,并返回一个Series。
     
    
- 
    
     
    
    
     
      get_value、set_value方法 根据行标签或列标签选取单个值
     
    
- 
    
     
    
    
     
      '''
     
    
- 
    
     
    
    
     
      import numpy as np
     
    
- 
    
     
    
    
     
      from pandas import  Series,DataFrame
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      print('Series的索引,默认数字索引可以工作。')
     
    
- 
    
     
    
    
     
      obj = Series(np.arange(4),index=['a','b','c','d'])
     
    
- 
    
     
    
    
     
      print('obj的b索引对应的值')
     
    
- 
    
     
    
    
     
      print(obj['b'])
     
    
- 
    
     
    
    
     
      print(obj[2])
     
    
- 
    
     
    
    
     
      print(obj[[2,3]])
     
    
- 
    
     
    
    
     
      print(obj[obj<2])
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      print('Series的数组切片')
     
    
- 
    
     
    
    
     
      print(obj['b':'c']) # 闭区间
     
    
- 
    
     
    
    
     
      obj['b':'c'] = 5    #将b和c索引的值重新赋值
     
    
- 
    
     
    
    
     
      print(obj)
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      print('DataFrame的索引')
     
    
- 
    
     
    
    
     
      data = DataFrame(np.arange(16).reshape((4,4)),
     
    
- 
    
     
    
    
     
                       index=['A','B','C','D'],
     
    
- 
    
     
    
    
     
                       columns=['N1','N2','N3','N4'])
     
    
- 
    
     
    
    
     
      print(data['N1'])   #打印N1列元素
     
    
- 
    
     
    
    
     
      print('打印N1、N3列元素,同时显示行索引\n',data[['N1','N3']])#打印N1、N3列元素,同时显示行索引
     
    
- 
    
     
    
    
     
      print('分片方式打印前两行元素\n',data[:2])
     
    
- 
    
     
    
    
     
      print('指定索引和列')
     
    
- 
    
     
    
    
     
      print(data.ix['B',['N2','N4']])
     
    
- 
    
     
    
    
     
      print('指定行索引显示A和B,列索引将按照3,0,1顺序显示即N4,N1,N2')
     
    
- 
    
     
    
    
     
      print(data.ix[['A', 'B'], [3, 0, 1]])
     
    
- 
    
     
    
    
     
      print(data.ix[0])   #打印第一行
     
    
- 
    
     
    
    
     
      print(data.ix[:'C', 'N2']) # 从A到C行的第2列元素显示。
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      print('根据条件选择')
     
    
- 
    
     
    
    
     
      print(data[data.N3>3])  #帅选第三列大于3的元素
     
    
- 
    
     
    
    
     
      print(data<5)   # 打印True或者False
     
    
- 
    
     
    
    
     
      data[data < 5] = 0  #将小于5的元素填充为0
     
    
- 
    
     
    
    
     
      print(data)
     
    
 
文章来源: brucelong.blog.csdn.net,作者:Bruce小鬼,版权归原作者所有,如需转载,请联系作者。
原文链接:brucelong.blog.csdn.net/article/details/80688859
        【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
            cloudbbs@huaweicloud.com
        
        
        
        
        
        
        - 点赞
- 收藏
- 关注作者
 
             
           
评论(0)