前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pandas-层次化索引

Pandas-层次化索引

作者头像
石晓文
发布2018-04-11 15:20:27
5780
发布2018-04-11 15:20:27
举报
文章被收录于专栏:小小挖掘机小小挖掘机

层次化索引是pandas的一项重要功能,它能使你在一个轴上有多个索引级别,也就是说,它能使你以低维度形式处理高维度数据,比如下面的代码:

代码语言:javascript
复制
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    0.497970
   2   -0.042377
   3   -0.018719
b  1    0.061412
   2   -1.313888
   3    0.751478
c  1   -0.241329
   2   -1.945047
d  2    0.460786
   3   -0.411931
dtype: float64

data.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]])

有了层次化索引之后,我们很容易的访问分块数据:

代码语言:javascript
复制
data['b']
#输出
1    0.061412
2   -1.313888
3    0.751478
dtype: float64

data[:,2]
#输出
a   -0.042377
b   -1.313888
c   -1.945047
d    0.460786
dtype: float64

层次化索引在数据重塑和基于分组的操作中扮演重要的角色。比如,上面的数据可以使用unstack方法重塑成为一个DataFrame:

代码语言:javascript
复制
data.unstack()
#输出
1   2   3
a   0.497970    -0.042377   -0.018719
b   0.061412    -1.313888   0.751478
c   -0.241329   -1.945047   NaN
d   NaN 0.460786    -0.411931

unstack的逆运算是stack()

代码语言:javascript
复制
data.unstack().stack()
#输出
a  1    0.497970
   2   -0.042377
   3   -0.018719
b  1    0.061412
   2   -1.313888
   3    0.751478
c  1   -0.241329
   2   -1.945047
d  2    0.460786
   3   -0.411931
dtype: float64

DataFrame的行列索引都可以使用层次化索引:

代码语言:javascript
复制
frame = pd.DataFrame(np.arange(12).reshape((4,3)),index=[['a','a','b','b'],[1,2,1,2]],columns=[['Ohio','Ohio','Colorado'],['Green','Red','Green']])
frame
#输出
Ohio    Colorado
Green   Red Green
a   1   0   1   2
2   3   4   5
b   1   6   7   8
2   9   10  11

我们可以创建层次化索引MulitIndex:

代码语言:javascript
复制
index = pd.MultiIndex.from_arrays([['Ohio','Ohio','Colorado'],['Green','Red','Green']],names=['state','color'])
index
#输出
MultiIndex(levels=[['Colorado', 'Ohio'], ['Green', 'Red']],
           labels=[[1, 1, 0], [0, 1, 0]],
           names=['state', 'color'])

frame.columns=index
frame
#输出
    state   Ohio    Colorado
color   Green   Red Green
a   1   0   1   2
2   3   4   5
b   1   6   7   8
2   9   10  11

我们可以给我们的索引赋予名字:

代码语言:javascript
复制
frame.index.names=['key1','key2']
frame
#输出
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

我们可以使用swaplevel交换两个索引的级别,swaplevel接受两个级别编号或者名称,并返回一个互换了级别的新对象:

代码语言:javascript
复制
frame.swaplevel('key1','key2')
#输出
    state   Ohio    Colorado
color   Green   Red Green
key2    key1            
1   a   0   1   2
2   a   3   4   5
1   b   6   7   8
2   b   9   10  11

使用层次化索引时,sort_index中的level指定了根据哪个索引级别进行排序,sum等汇总统计函数中的level参数指定了根据哪个索引级别进行汇总统计:

代码语言:javascript
复制
frame.sort_index(level = 0)
frame.sum(level='key2')
frame.sum(level='color',axis=1)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-10-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小小挖掘机 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档