pandas基础--层次化索引

以下代码的前提:import pandas as pd

层次化索引使你能在一个轴上拥有多个(两个以上)索引级别。抽象的说,它使你能以低维度形式处理高维度数据。

>>> data = pd.Series(np.random.randn(10), index=[[‘a‘, ‘a‘, ‘a‘, ‘b‘, ‘b‘, ‘b‘, ‘c‘, ‘c‘, ‘d‘, ‘d‘], [1, 2, 3, 1, 2, 3, 1, 2, 2, 3]])
>>> data  
a  1    3.230188
   2    0.596511
   3    0.956307
b  1    1.132221
   2    0.746174
   3    0.470007
c  1    0.880883
   2    0.757047
d  2   -0.028331
   3    0.382625
dtype: float64
>>> data.index #带MultiIndex索引的Series的格式化输出形式,索引之间的“间隔”表示“直接使用上面的标签”
MultiIndex([(‘a‘, 1),
            (‘a‘, 2),
            (‘a‘, 3),
            (‘b‘, 1),
            (‘b‘, 2),
            (‘b‘, 3),
            (‘c‘, 1),
            (‘c‘, 2),
            (‘d‘, 2),
            (‘d‘, 3)],
           )
>>> data[‘b‘]  #选取数据子集
1    1.132221
2    0.746174
3    0.470007
dtype: float64
>>> data[‘b‘: ‘c‘] 
b  1    1.132221
   2    0.746174
   3    0.470007
c  1    0.880883
   2    0.757047
dtype: float64
>>> data.loc[[‘b‘, ‘d‘]] 
b  1    1.132221
   2    0.746174
   3    0.470007
d  2   -0.028331
   3    0.382625
dtype: float64
>>> data[:, 2]  #在“内层”中进行选取
a    0.596511
b    0.746174
c    0.757047
d   -0.028331
dtype: float64

层次索引在数据重塑和基于和基于分组的操作(如透视表生成)中有重要作用。如可以通过unstack方法重新安排多层数据到一个DataFrame中。

>>> data
a  1    3.230188
   2    0.596511
   3    0.956307
b  1    1.132221
   2    0.746174
   3    0.470007
c  1    0.880883
   2    0.757047
d  2   -0.028331
   3    0.382625
dtype: float64
>>> data.unstack()
          1         2         3
a  3.230188  0.596511  0.956307
b  1.132221  0.746174  0.470007
c  0.880883  0.757047       NaN
d       NaN -0.028331  0.382625
>>> data.unstack().stack()  #stack使unstack的逆运算
a  1    3.230188
   2    0.596511
   3    0.956307
b  1    1.132221
   2    0.746174
   3    0.470007
c  1    0.880883
   2    0.757047
d  2   -0.028331
   3    0.382625
dtype: float64

对于一个DataFrame,每条轴都可以分成索引,每层都可以由名字(可能是字符串,也可以是别的python对象)。如果指定了名字,它们就会显示在控制台输出中。

>>> frame = pd.DataFrame(np.arange(12).reshape((4, 3)), index=[[‘a‘, ‘a‘, ‘b‘, ‘b‘], [1, 2, 1, 
-2]], columns=[[‘Oh‘, ‘Oh‘, ‘Co‘], [‘Gr‘, ‘Re‘, ‘Gr‘]])
>>> frame
     Oh      Co
     Gr  Re  Gr
a  1  0   1   2
   2  3   4   5
b  1  6   7   8
  -2  9  10  11
>>> frame.index.names = [‘key1‘, ‘key2‘]
>>> frame.columns.names = [‘state‘, ‘color‘] 
>>> frame
state     Oh      Co
color     Gr  Re  Gr
key1 key2
a     1    0   1   2
      2    3   4   5
b     1    6   7   8
     -2    9  10  11
>>> frame[‘Oh‘] 
color      Gr  Re
key1 key2
a     1     0   1
      2     3   4
b     1     6   7
     -2     9  10

1.1 重排分级排序

有时需要调整某条轴上各级别的顺序,或根据指定级别上的值对数据进行排序。swaplevel接受两个级别编号或名称,并返回一个互换了级别的新对象(当数据不会发生变化)。

>>> frame
state     Oh      Co
color     Gr  Re  Gr
key1 key2
a     1    0   1   2
      2    3   4   5
b     1    6   7   8
     -2    9  10  11
>>> frame.swaplevel(‘key1‘, ‘key2‘)
state     Oh      Co
color     Gr  Re  Gr
key2 key1
 1   a     0   1   2
 2   a     3   4   5
 1   b     6   7   8
-2   b     9  10  11

1.2  根据级别汇总统计

许多对DataFrame和Series的描述和汇总统计都有一个level选项,用于指定在某条轴上求和的级别。

>>> frame 
state     Oh      Co
color     Gr  Re  Gr
key1 key2
a     1    0   1   2
      2    3   4   5
b     1    6   7   8
     -2    9  10  11
>>> frame.sum(level=‘key2‘)
state Oh      Co
color Gr  Re  Gr
key2
 1     6   8  10
 2     3   4   5
-2     9  10  11
>>> frame.sum(level=‘color‘, axis=1) 
color      Gr  Re
key1 key2
a     1     2   1
      2     8   4
b     1    14   7
     -2    20  10
>>>

1.3 使用DataFrame的列

经常将DataFrame的一个或多个列当作行索引来使用,或者希望将行索引变成DataFrame的列。

DataFrame的set_index函数会将其一个或多个列转换为行索引,并创建一个新的DataFrame。

>>> frame = pd.DataFrame({‘a‘: range(7), ‘b‘: range(7, 0, -1), ‘c‘: [‘one‘, ‘one‘, ‘one‘, ‘two‘, ‘two‘, ‘two‘, ‘two‘], ‘d‘: [0, 1, 2, 0, 1, 2, 3]})
>>> frame
   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  two  2
6  6  1  two  3
>>> frame2 = frame.set_index([‘c‘, ‘d‘])  
>>> frame2
       a  b
c   d
one 0  0  7
    1  1  6
    2  2  5
two 0  3  4
    1  4  3
    2  5  2
    3  6  1
>>> frame.set_index([‘c‘, ‘d‘], drop=False)  #可选择保留那些列
       a  b    c  d
c   d
one 0  0  7  one  0
    1  1  6  one  1
    2  2  5  one  2
two 0  3  4  two  0
    1  4  3  two  1
    2  5  2  two  2
    3  6  1  two  3

reset_index的功能和set_index刚好相反、层次化索引的级别会被转移到列里面:

>>> frame2 
       a  b
c   d
one 0  0  7
    1  1  6
    2  2  5
two 0  3  4
    1  4  3
    2  5  2
    3  6  1
>>> frame2.reset_index() 
     c  d  a  b
0  one  0  0  7
1  one  1  1  6
2  one  2  2  5
3  two  0  3  4
4  two  1  4  3
5  two  2  5  2
6  two  3  6  1

相关推荐