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

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

Series和DataFrame的索引方式

obj = Series(arange(5), index = ['a','b','c','d','e'])	
#按标签索引	
obj['c']	
2	
#索引多个值	
obj[2:4]	
c    2	
d    3	
dtype: int32	
#按标签索引多个值	
obj[['b','c','d']]	
b    1	
c    2	
d    3	
dtype: int32	
#与切片不同的是,索引的末尾是包括在内的	
obj['b':'c']	
b    1	
c    2	
dtype: int32

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

#创建一个DataFrame	
data = {'city':['LAL','HOU','PHI','TOR'],	
        'year':[1996,1997,1996,1997],	
        'score':[30.3,30.1,29.4,25.6]}	
frame = DataFrame(data, index = ['Lakers','Rockets','Sixers','Raptors'])	
frame	
    city    score   year	
Lakers    LAL 30.3    1996	
Rockets    HOU 30.1    1997	
Sixers    PHI 29.4    1996	
Raptors    TOR 25.6    1997

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

#按列索引	
frame['city']	
Lakers     LAL	
Rockets    HOU	
Sixers     PHI	
Raptors    TOR	
Name: city, dtype: object	
#索引多个列	
frame[['city','score']]	
    city    score	
Lakers    LAL 30.3	
Rockets    HOU 30.1	
Sixers    PHI 29.4	
Raptors    TOR 25.6

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

#取前两行	
frame[:2]	
    city    score   year	
Lakers    LAL 30.3    1996	
Rockets    HOU 30.1    1997	
#按条件索引	
frame[frame['score']>30]	
    city    score   year	
Lakers    LAL 30.3    1996	
Rockets    HOU 30.1    1997	
#loc方法直接进行行索引	
frame.loc[['Sixers','Raptors']]	
    city    score   year	
Sixers    PHI 29.4    1996	
Raptors    TOR 25.6    1997

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

pandas层次化索引

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

#创建一个具有多层索引的Series	
data2 = Series(random.randn(10),	
              index = [['a','a','a','b','b','b','c','c','d','d'],	
                      [1,2,3,1,2,3,1,2,2,3]])	
data2	
a  1   -0.234979	
   2    1.344633	
   3   -0.288830	
b  1   -0.351565	
   2    1.321889	
   3   -0.452482	
c  1    0.923785	
   2    0.315827	
d  2    0.439779	
   3   -1.491468	
dtype: float64	
#查看该Series的层级索引对象	
data2.index	
MultiIndex(levels=[['a', 'b', 'c', 'd'], [1, 2, 3]],	
           labels=[[0, 0, 0, 1, 1, 1, 2, 2, 3, 3], [0, 1, 2, 0, 1, 2, 0, 1, 1, 2]])	
#第一层索引	
data2['b']	
1   -0.351565	
2    1.321889	
3   -0.452482	
dtype: float64	
#第一层索引多个对象	
data2['b':'c']	
b  1   -0.351565	
   2    1.321889	
   3   -0.452482	
c  1    0.923785	
   2    0.315827	
dtype: float64

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

data2.loc[['b','d']]	
b  1   -0.351565	
   2    1.321889	
   3   -0.452482	
d  2    0.439779	
   3   -1.491468	
dtype: float64	
#也可以在内层直接索引	
#即访问第二层数据下所有的第二索引	
data2[:,2]	
a    1.344633	
b    1.321889	
c    0.315827	
d    0.439779	
dtype: float64

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

#将包含多层索引的Series转化为一个DataFrame	
data2.unstack()	
    1   2   3	
a    -0.234979   1.344633    -0.288830	
b    -0.351565   1.321889    -0.452482	
c    0.923785    0.315827    NaN	
d    NaN         0.439779    -1.491468

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

#返回去也是容易的	
data2.unstack().stack()	
a  1   -0.234979	
   2    1.344633	
   3   -0.288830	
b  1   -0.351565	
   2    1.321889	
   3   -0.452482	
c  1    0.923785	
   2    0.315827	
d  2    0.439779	
   3   -1.491468	
dtype: float64

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

#创建一个具有分层索引的DataFrame	
frame2 = DataFrame(arange(12).reshape((4,3)),	
                  index=[['a','a','b','b'],[1,2,1,2]],	
                  columns=[['Ohio','Ohio','Colorado'],	
                          ['Green','Red','Green']])	
frame2	
                  Ohio    Colorado	
           Green  Red     Green	
a       1    0    1        2	
        2    3    4        5	
b       1    6    7        8	
        2    9    10       11	
	
#可以为各层指定名称	
frame2.index.names = ['key1','key2']	
frame2.columns.names = ['state','color']	
frame2	
        state   Ohio    Colorado	
        color    Green   Red Green	
key1    key2            	
a    1   0   1   2	
     2    3   4   5	
b    1   6   7   8	
     2    9   10  11	
	
#根据分部的列标签进行索引	
frame2['Colorado']	
    color   Green	
key1    key2    	
a    1     2	
     2     5	
b    1     8	
     2     11	
#将DataFrame的列作为行来索引	
frame3 = DataFrame({'a':range(7),'b':range(7,0,-1),	
                   'c':['one','one','one','two','two','three','three'],	
                   'd':[0,1,2,0,1,2,3]})	
frame3	
     a   b     c     d	
0    0   7   one     0	
1    1   6   one     1	
2    2   5   one     2	
3    3   4   two     0	
4    4   3   two     1	
5    5   2   three   2	
6    6   1   three   3

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

参考资料:

python for data analysis

往期精彩:


一个数据科学热爱者的学习历程

640?
640?wx_fmt=jpeg
长按二维码.关注数据科学家养成记

640?wx_fmt=jpeg

你可能感兴趣的:(利用pandas进行数据分析(二):索引与层次化索引)