数据分析工具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对象

 


  
  1. print(type(ser_obj.index))
  2. print(type(df_obj2.index))
  3. print(df_obj2.index)

运行结果:


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

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

 


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

运行结果:


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

常见的Index种类

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

Series索引

1. index 指定行索引名

 


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

运行结果:


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

2. 行索引

ser_obj[‘label’], ser_obj[pos]

 


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

运行结果:


  
  1. 1
  2. 2

3. 切片索引

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

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

 


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

运行结果:


  
  1. b 1
  2. c 2
  3. dtype: int64
  4. b 1
  5. c 2
  6. d 3
  7. dtype: int64

4. 不连续索引

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

 


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

运行结果:


  
  1. a 0
  2. c 2
  3. e 4
  4. dtype: int64
  5. a 0
  6. e 4
  7. dtype: int64

5. 布尔索引

 


  
  1. # 布尔索引
  2. ser_bool = ser_obj > 2
  3. print(ser_bool)
  4. print(ser_obj[ser_bool])
  5. print(ser_obj[ser_obj > 2])

运行结果:


  
  1. a False
  2. b False
  3. c False
  4. d True
  5. e True
  6. dtype: bool
  7. d 3
  8. e 4
  9. dtype: int64
  10. d 3
  11. e 4
  12. dtype: int64

DataFrame索引

1. columns 指定列索引名

 


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

运行结果:


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

 

 

2. 列索引

df_obj[[‘label’]]

 


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

运行结果:


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

3. 不连续索引

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

 


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

运行结果:


  
  1. a c
  2. 0 -0.241678 0.843546
  3. 1 -0.526918 1.124420
  4. 2 -1.074163 -0.309822
  5. 3 -0.716816 -2.123637
  6. 4 0.368212 0.064703
  7. b d
  8. 0 0.621589 -0.383105
  9. 1 -0.485325 -0.653144
  10. 2 0.939324 -0.209149
  11. 3 1.844654 -1.323484
  12. 4 -0.910324 0.486016

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

Pandas的高级索引有3种

1. loc 标签索引

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

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

 


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

运行结果:


  
  1. b 1
  2. c 2
  3. d 3
  4. dtype: int64
  5. b 1
  6. c 2
  7. d 3
  8. dtype: int64
  9. 0 -0.241678
  10. 1 -0.526918
  11. 2 -1.074163
  12. 3 -0.716816
  13. 4 0.368212
  14. Name: a, dtype: float64
  15. 0 -0.241678
  16. 1 -0.526918
  17. 2 -1.074163
  18. Name: a, dtype: float64

2. iloc 位置索引

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

 


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

运行结果:


  
  1. b 1
  2. c 2
  3. dtype: int64
  4. b 1
  5. c 2
  6. dtype: int64
  7. 0 -0.241678
  8. 1 -0.526918
  9. Name: a, dtype: float64

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

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

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

示例代码:


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

运行结果:


  
  1. b 1
  2. c 2
  3. dtype: int64
  4. b 1
  5. c 2
  6. dtype: int64
  7. 0 -0.241678
  8. 1 -0.526918
  9. 2 -1.074163
  10. 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个月内不可修改。