利用pandas进行数据分析(二):索引与层次化索引

浏览: 2514

     继上一节的 pandas基本数据结构的介绍之后,本节继续介绍 pandas中操作 SeriesDataFrame的基本手段。一个最常用的操作就是索引,如何根据分析目的对 SeriesDataFrame进行索引访问得到数据是利用 pandas进行数据分析的基本技能之一。索引用的好,对于数据访问、筛选和过滤以及理解 pandas数据结构至关重要。

Series和DataFrame的索引方式

  1. obj = Series(arange(5), index = ['a','b','c','d','e'])

  2. #按标签索引

  3. obj['c']

  4. 2

  5. #索引多个值

  6. obj[2:4]

  7. c    2

  8. d    3

  9. dtype: int32

  10. #按标签索引多个值

  11. obj[['b','c','d']]

  12. b    1

  13. c    2

  14. d    3

  15. dtype: int32

  16. #与切片不同的是,索引的末尾是包括在内的

  17. obj['b':'c']

  18. b    1

  19. c    2

  20. dtype: int32

     可见 Series的索引方式非常简单,既可以按其索引标签来进行索引,也可以按数字排序来进行索引。需要注意的是, pandas中索引与切片有一点细微的区别就是索引的末端是包括在内的。 再来看 DataFrame的索引和访问方式:

  1. #创建一个DataFrame

  2. data = {'city':['LAL','HOU','PHI','TOR'],

  3.        'year':[1996,1997,1996,1997],

  4.        'score':[30.3,30.1,29.4,25.6]}

  5. frame = DataFrame(data, index = ['Lakers','Rockets','Sixers','Raptors'])

  6. frame

  7.    city    score   year

  8. Lakers    LAL 30.3    1996

  9. Rockets    HOU 30.1    1997

  10. Sixers    PHI 29.4    1996

  11. Raptors    TOR 25.6    1997

DataFrame具有行列属性,所以在索引上除了习惯性的按列索引之外,按行索引也是不错的数据访问方式:

  1. #按列索引

  2. frame['city']

  3. Lakers     LAL

  4. Rockets    HOU

  5. Sixers     PHI

  6. Raptors    TOR

  7. Name: city, dtype: object

  8. #索引多个列

  9. frame[['city','score']]

  10.    city    score

  11. Lakers    LAL 30.3

  12. Rockets    HOU 30.1

  13. Sixers    PHI 29.4

  14. Raptors    TOR 25.6

     按列名进行多个列的索引时,传入的是一个 list形态。再看 DataFrame按行索引的方式:

  1. #取前两行

  2. frame[:2]

  3.    city    score   year

  4. Lakers    LAL 30.3    1996

  5. Rockets    HOU 30.1    1997

  6. #按条件索引

  7. frame[frame['score']>30]

  8.    city    score   year

  9. Lakers    LAL 30.3    1996

  10. Rockets    HOU 30.1    1997

  11. #loc方法直接进行行索引

  12. frame.loc[['Sixers','Raptors']]

  13.    city    score   year

  14. Sixers    PHI 29.4    1996

  15. Raptors    TOR 25.6    1997

     所以在 pandas中按行索引也较为方便,特别注意一下 loc方法即可, loc方法的以前版本为 ix,本身即为索引访问之意。除此之外,针对 SeriesDataFrame索引的方法还包括 reindexxs以及 get_value等方法,具体大家可以试一试效果。

pandas层次化索引

     说完了基础索引,再来看 pandas层次化索引。作为 pandas的一项重要功能,顾名思义就是能够对数据对象进行多层索引,具体看实例:

  1. #创建一个具有多层索引的Series

  2. data2 = Series(random.randn(10),

  3.              index = [['a','a','a','b','b','b','c','c','d','d'],

  4.                      [1,2,3,1,2,3,1,2,2,3]])

  5. data2

  6. a  1   -0.234979

  7.   2    1.344633

  8.   3   -0.288830

  9. b  1   -0.351565

  10.   2    1.321889

  11.   3   -0.452482

  12. c  1    0.923785

  13.   2    0.315827

  14. d  2    0.439779

  15.   3   -1.491468

  16. dtype: float64

  17. #查看该Series的层级索引对象

  18. data2.index

  19. MultiIndex(levels=[['a', 'b', 'c', 'd'], [1, 2, 3]],

  20.           labels=[[0, 0, 0, 1, 1, 1, 2, 2, 3, 3], [0, 1, 2, 0, 1, 2, 0, 1, 1, 2]])

  21. #第一层索引

  22. data2['b']

  23. 1   -0.351565

  24. 2    1.321889

  25. 3   -0.452482

  26. dtype: float64

  27. #第一层索引多个对象

  28. data2['b':'c']

  29. b  1   -0.351565

  30.   2    1.321889

  31.   3   -0.452482

  32. c  1    0.923785

  33.   2    0.315827

  34. dtype: float64

loc方法也可以实现同样的索引访问效果:

  1. data2.loc[['b','d']]

  2. b  1   -0.351565

  3.   2    1.321889

  4.   3   -0.452482

  5. d  2    0.439779

  6.   3   -1.491468

  7. dtype: float64

  8. #也可以在内层直接索引

  9. #即访问第二层数据下所有的第二索引

  10. data2[:,2]

  11. a    1.344633

  12. b    1.321889

  13. c    0.315827

  14. d    0.439779

  15. dtype: float64

     如果觉得多层索引的 Series不太好看,也可以直接通过 unstack方法将其转化为 DataFrame:

  1. #将包含多层索引的Series转化为一个DataFrame

  2. data2.unstack()

  3.    1   2   3

  4. a    -0.234979   1.344633    -0.288830

  5. b    -0.351565   1.321889    -0.452482

  6. c    0.923785    0.315827    NaN

  7. d    NaN         0.439779    -1.491468

unstackstack互为逆运算,转换过来的 DataFrame也可以通过 stack方法换回去。

  1. #返回去也是容易的

  2. data2.unstack().stack()

  3. a  1   -0.234979

  4.   2    1.344633

  5.   3   -0.288830

  6. b  1   -0.351565

  7.   2    1.321889

  8.   3   -0.452482

  9. c  1    0.923785

  10.   2    0.315827

  11. d  2    0.439779

  12.   3   -1.491468

  13. dtype: float64

     以上是 Series的层次化索引方式,再来看看 DataFrame的层次化索引:

  1. #创建一个具有分层索引的DataFrame

  2. frame2 = DataFrame(arange(12).reshape((4,3)),

  3.                  index=[['a','a','b','b'],[1,2,1,2]],

  4.                  columns=[['Ohio','Ohio','Colorado'],

  5.                          ['Green','Red','Green']])

  6. frame2

  7.                  Ohio    Colorado

  8.           Green Red     Green

  9. a       1    0    1        2

  10.        2    3    4        5

  11. b       1    6    7       8

  12.        2    9    10       11

  13. #可以为各层指定名称

  14. frame2.index.names = ['key1','key2']

  15. frame2.columns.names = ['state','color']

  16. frame2

  17.        state   Ohio    Colorado

  18.        color    Green   Red Green

  19. key1    key2            

  20. a    1   0   1   2

  21.     2    3   4   5

  22. b    1   6   7   8

  23.     2    9   10  11

  24. #根据分部的列标签进行索引

  25. frame2['Colorado']

  26.    color   Green

  27. key1    key2    

  28. a    1    2

  29.     2     5

  30. b    1    8

  31.     2     11

  32. #将DataFrame的列作为行来索引

  33. frame3 = DataFrame({'a':range(7),'b':range(7,0,-1),

  34.                   'c':['one','one','one','two','two','three','three'],

  35.                   'd':[0,1,2,0,1,2,3]})

  36. frame3

  37.     a   b     c     d

  38. 0    0   7   one     0

  39. 1    1   6   one    1

  40. 2    2   5   one    2

  41. 3    3   4   two     0

  42. 4    4   3   two     1

  43. 5    5   2   three   2

  44. 6    6   1   three   3


     好了,本次推送就给大家介绍到这里啦。关于的数据索引和访问方法,除了对基本的语法有所熟识之外,更需要在实际的数据处理实践中练习掌握。

参考资料:

python for data analysis


image.png

推荐 1
本文由 鲁伟 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册