全文共401字,预计阅读时间5分钟。
层次化索引是pandas的一项重要功能,它能使你在一个轴上有多个索引级别,也就是说,它能使你以低维度形式处理高维度数据,比如下面的代码:
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.4979702 -0.0423773 -0.018719
b 1 0.0614122 -1.3138883 0.751478
c 1 -0.2413292 -1.945047
d 2 0.4607863 -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]])
有了层次化索引之后,我们很容易的访问分块数据:
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:
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()
data.unstack().stack()
#输出
a 1 0.4979702 -0.0423773 -0.018719
b 1 0.0614122 -1.3138883 0.751478
c 1 -0.2413292 -1.945047
d 2 0.4607863 -0.411931
dtype: float64
DataFrame的行列索引都可以使用层次化索引:
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:
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=indexframe
#输出
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
我们可以给我们的索引赋予名字:
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接受两个级别编号或者名称,并返回一个互换了级别的新对象:
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参数指定了根据哪个索引级别进行汇总统计:
frame.sort_index(level = 0)
frame.sum(level='key2')
frame.sum(level='color',axis=1)
原文链接:https://mp.weixin.qq.com/s?__biz=MzI1MzY0MzE4Mg==&mid=2247483787&idx=2&sn=6667a9cf3a5809d9aab5efb9e209dc7d&chksm=e9d0114adea7985cc41bb218a46d368ff243ad72188da83c22ead3962d5ebcd524b8ac62cba0&scene=21#wechat_redirect
查阅更为简洁方便的分类文章以及最新的课程、产品信息,请移步至全新呈现的“LeadAI学院官网”:
www.leadai.org
请关注人工智能LeadAI公众号,查看更多专业文章
大家都在看
