利用Python进行数据分析——Pandas(4)

层次化索引

层次化索引(hierarchical indexing)是pandas的一项重要功能,它使你能在一个轴上拥有多个(两个以上)索引级别。抽象点说,它使你能以低维度形式处理高维度数据。我们先来看一个简单的例子:创建一个Series,并用一个由列表或数组组成的列表作为索引。

from pandas import Series
import numpy as np
data = 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]])
print(data)

#output
a  1    1.157065
   2   -1.075027
   3   -0.800397
b  1    1.255714
   2    0.035368
   3   -0.833140
c  1   -0.881068
   2   -0.943168
d  2   -0.288507
   3   -0.130029
dtype: float64

这就是带有MultiIndex索引的Series的格式化输出形式。索引之间的“间隔”表示“直接使用上面的标签”:

print(data.index)
#output
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]])

对于一个层次化索引的对象,选取数据子集的操作很简单:

print(data['a'])
print(data['a':'c'])
print(data.ix[['a','c']])
#output
1   -1.306784
2   -1.172157
3    0.773601
dtype: float64

a  1   -1.306784
   2   -1.172157
   3    0.773601
b  1   -0.488442
   2    1.447765
   3    0.165453
c  1    0.924112
   2   -1.192613
dtype: float64

a  1   -1.306784
   2   -1.172157
   3    0.773601
c  1    0.924112
   2   -1.192613
dtype: float64

有时甚至还可以在“内层”中进行选取:

In [267]: data[:, 2]
Out[267]:
a 0.852965
b -2.304234
c -1.332610
d 1.074623

层次化索引在数据重塑和基于分组的操作(如透视表生成)中扮演着重要的角色。比如说,这段数据可以通过其unstack方法被重新安排到一个DataFrame中:

print(data.unstack())
#output
          1         2         3
a -0.184154  1.268789  0.330326
b -0.313369 -0.103031 -1.093874
c  0.037298 -2.274778       NaN
d       NaN -2.220444  0.769246

unstack的逆运算是stack:

In [269]: data.unstack().stack()
Out[269]:
a 1 0.670216
2 0.852965
3 -0.955869
b 1 -0.023493
2 -2.304234
3 -0.652469
c 1 -1.218302
2 -1.332610
d 2 1.074623
3 0.723642

对于一个DataFrame,每条轴都可以有分层索引:

frame = DataFrame(np.arange(12).reshape((4, 3)),
                  index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]],
                  columns=[['Ohio', 'Ohio', 'Colorado'],
                           ['Green', 'Red', 'Green']])
print(frame)
print(frame['Ohio'])
#output
     Ohio     Colorado
    Green Red    Green
a 1     0   1        2
  2     3   4        5
b 1     6   7        8
  2     9  10       11

     Green  Red
a 1      0    1
  2      3    4
b 1      6    7
  2      9   10

其他内容

暂略

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值