数据分析工具Pandas(2):Pandas的索引操作

举报
DrugAI 发表于 2021/07/15 02:39:23 2021/07/15
【摘要】 数据分析工具Pandas(1):Pandas的数据结构 数据分析工具Pandas(2):Pandas的索引操作 Pandas的索引操作 索引对象Index 1. Series和DataFrame中的索引都是Index对象   print(type(ser_obj.index))print(type(df_obj2.index)) print(d...

数据分析工具Pandas(1):Pandas的数据结构

数据分析工具Pandas(2):Pandas的索引操作

Pandas的索引操作

索引对象Index

1. Series和DataFrame中的索引都是Index对象

 


      print(type(ser_obj.index))
      print(type(df_obj2.index))
      print(df_obj2.index)
  
 

运行结果:


      <class 'pandas.indexes.range.RangeIndex'>
      <class 'pandas.indexes.numeric.Int64Index'>
      Int64Index([0, 1, 2, 3], dtype='int64')
  
 

2. 索引对象不可变,保证了数据的安全

 


      # 索引对象不可变
      df_obj2.index[0] = 2
  
 

运行结果:


      ---------------------------------------------------------------------------
      TypeError Traceback (most recent call last)
      <ipython-input-23-7f40a356d7d1> in <module>()
      1 # 索引对象不可变
      ----> 2 df_obj2.index[0] = 2
      /Users/Power/anaconda/lib/python3.6/site-packages/pandas/indexes/base.py in __setitem__(self, key, value)
        1402
        1403 def __setitem__(self, key, value):
      -> 1404 raise TypeError("Index does not support mutable operations")
        1405
        1406 def __getitem__(self, key):
      TypeError: Index does not support mutable operations
  
 

常见的Index种类

  • Index,索引
  • Int64Index,整数索引
  • MultiIndex,层级索引
  • DatetimeIndex,时间戳类型

Series索引

1. index 指定行索引名

 


      ser_obj = pd.Series(range(5), index = ['a', 'b', 'c', 'd', 'e'])
      print(ser_obj.head())
  
 

运行结果:


      a 0
      b 1
      c 2
      d 3
      e 4
      dtype: int64
  
 

2. 行索引

ser_obj[‘label’], ser_obj[pos]

 


      # 行索引
      print(ser_obj['b'])
      print(ser_obj[2])
  
 

运行结果:


      1
      2
  
 

3. 切片索引

ser_obj[2:4], ser_obj[‘label1’: ’label3’]

注意,按索引名切片操作时,是包含终止索引的。

 


      # 切片索引
      print(ser_obj[1:3])
      print(ser_obj['b':'d'])
  
 

运行结果:


      b 1
      c 2
      dtype: int64
      b 1
      c 2
      d 3
      dtype: int64
  
 

4. 不连续索引

ser_obj[[‘label1’, ’label2’, ‘label3’]]

 


      # 不连续索引
      print(ser_obj[[0, 2, 4]])
      print(ser_obj[['a', 'e']])
  
 

运行结果:


      a 0
      c 2
      e 4
      dtype: int64
      a 0
      e 4
      dtype: int64
  
 

5. 布尔索引

 


      # 布尔索引
      ser_bool = ser_obj > 2
      print(ser_bool)
      print(ser_obj[ser_bool])
      print(ser_obj[ser_obj > 2])
  
 

运行结果:


      a False
      b False
      c False
      d True
      e True
      dtype: bool
      d 3
      e 4
      dtype: int64
      d 3
      e 4
      dtype: int64
  
 

DataFrame索引

1. columns 指定列索引名

 


      import numpy as np
      df_obj = pd.DataFrame(np.random.randn(5,4), columns = ['a', 'b', 'c', 'd'])
      print(df_obj.head())
  
 

运行结果:


      a b c d
      0 -0.241678  0.621589  0.843546 -0.383105
      1 -0.526918 -0.485325  1.124420 -0.653144
      2 -1.074163  0.939324 -0.309822 -0.209149
      3 -0.716816  1.844654 -2.123637 -1.323484
      4  0.368212 -0.910324  0.064703  0.486016
  
 

 

 

2. 列索引

df_obj[[‘label’]]

 


      # 列索引
      print(df_obj['a']) # 返回Series类型
      print(df_obj[[0]]) # 返回DataFrame类型
      print(type(df_obj[[0]])) # 返回DataFrame类型
  
 

运行结果:


      0   -0.241678
      1   -0.526918
      2   -1.074163
      3   -0.716816
      4 0.368212
      Name: a, dtype: float64
      <class 'pandas.core.frame.DataFrame'>
  
 

3. 不连续索引

df_obj[[‘label1’, ‘label2’]]

 


      # 不连续索引
      print(df_obj[['a','c']])
      print(df_obj[[1, 3]])
  
 

运行结果:


      a c
      0 -0.241678  0.843546
      1 -0.526918  1.124420
      2 -1.074163 -0.309822
      3 -0.716816 -2.123637
      4  0.368212  0.064703
      b d
      0  0.621589 -0.383105
      1 -0.485325 -0.653144
      2  0.939324 -0.209149
      3  1.844654 -1.323484
      4 -0.910324  0.486016
  
 

高级索引:标签、位置和混合

Pandas的高级索引有3种

1. loc 标签索引

DataFrame 不能直接切片,可以通过loc来做切片

loc是基于标签名的索引,也就是我们自定义的索引名

 


      # 标签索引 loc
      # Series
      print(ser_obj['b':'d'])
      print(ser_obj.loc['b':'d'])
      # DataFrame
      print(df_obj['a'])
      # 第一个参数索引行,第二个参数是列
      print(df_obj.loc[0:2, 'a'])
  
 

运行结果:


      b 1
      c 2
      d 3
      dtype: int64
      b 1
      c 2
      d 3
      dtype: int64
      0   -0.241678
      1   -0.526918
      2   -1.074163
      3   -0.716816
      4 0.368212
      Name: a, dtype: float64
      0   -0.241678
      1   -0.526918
      2   -1.074163
      Name: a, dtype: float64
  
 

2. iloc 位置索引

作用和loc一样,不过是基于索引编号来索引

 


      # 整型位置索引 iloc
      # Series
      print(ser_obj[1:3])
      print(ser_obj.iloc[1:3])
      # DataFrame
      print(df_obj.iloc[0:2, 0]) # 注意和df_obj.loc[0:2, 'a']的区别
  
 

运行结果:


      b 1
      c 2
      dtype: int64
      b 1
      c 2
      dtype: int64
      0   -0.241678
      1   -0.526918
      Name: a, dtype: float64
  
 

3. ix 标签与位置混合索引

ix是以上二者的综合,既可以使用索引编号,又可以使用自定义索引,要视情况不同来使用,

如果索引既有数字又有英文,那么这种方式是不建议使用的,容易导致定位的混乱。

示例代码:


      # 混合索引 ix
      # Series
      print(ser_obj.ix[1:3])
      print(ser_obj.ix['b':'c'])
      # DataFrame
      print(df_obj.loc[0:2, 'a'])
      print(df_obj.ix[0:2, 0])
  
 

运行结果:


      b 1
      c 2
      dtype: int64
      b 1
      c 2
      dtype: int64
      0   -0.241678
      1   -0.526918
      2   -1.074163
      Name: a, dtype: float64
  
 

注意

DataFrame索引操作,可将其看作ndarray的索引操作

标签的切片索引是包含末尾位置的

 

参考资料

 

文章来源: drugai.blog.csdn.net,作者:DrugAI,版权归原作者所有,如需转载,请联系作者。

原文链接:drugai.blog.csdn.net/article/details/104284470

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。