pandas 层次化索引的实现方法
技术  /  管理员 发布于 7年前   197
层次化索引是pandas的一项重要功能,它使你能在一个轴上拥有多个(两个以上)索引级别。
创建一个Series,并用一个由列表或数组组成的列表作为索引。
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]])dataOut[6]: a 1 -2.842857 2 0.376199 3 -0.512978b 1 0.225243 2 -1.242407 3 -0.663188c 1 -0.149269 2 -1.079174d 2 -0.952380 3 -1.113689dtype: float64
这就是带MultiIndex索引的Series的格式化输出形式。索引之间的“间隔”表示“直接使用上面的标签”。
data.indexOut[7]: 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']Out[8]: 1 0.2252432 -1.2424073 -0.663188dtype: float64data['b':'c']Out[10]: b 1 0.225243 2 -1.242407 3 -0.663188c 1 -0.149269 2 -1.079174dtype: float64data.ix[['b','d']]__main__:1: DeprecationWarning: .ix is deprecated. Please use.loc for label based indexing or.iloc for positional indexingSee the documentation here:http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecatedOut[11]: b 1 0.225243 2 -1.242407 3 -0.663188d 2 -0.952380 3 -1.113689dtype: float64
甚至可以在“内层”中进行选取:
data[:,2]Out[12]: a 0.376199b -1.242407c -1.079174d -0.952380dtype: float64
层次化索引在数据重塑和基于分组的操作中扮演重要角色。
可以通过unstack方法被重新安排到一个DataFrame中:
data.unstack()Out[13]: 1 2 3a -2.842857 0.376199 -0.512978b 0.225243 -1.242407 -0.663188c -0.149269 -1.079174 NaNd NaN -0.952380 -1.113689#unstack的逆运算是stackdata.unstack().stack()Out[14]: a 1 -2.842857 2 0.376199 3 -0.512978b 1 0.225243 2 -1.242407 3 -0.663188c 1 -0.149269 2 -1.079174d 2 -0.952380 3 -1.113689dtype: float64
对于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']])frameOut[16]: Ohio Colorado Green Red Greena 1 0 1 2 2 3 4 5b 1 6 7 8 2 9 10 11
各层都可以有名字。如果指定了名称,它们会显示在控制台中(不要将索引名称和轴标签混为一谈!)
frame.index.names=['key1','key2']frame.columns.names=['state','color']frameOut[22]: state Ohio Coloradocolor Green Red Greenkey1 key2 a 1 0 1 2 2 3 4 5b 1 6 7 8 2 9 10 11
由于有了分部的列索引,可以轻松选取列分组:
frame['Ohio']Out[23]: color Green Redkey1 key2 a 1 0 1 2 3 4b 1 6 7 2 9 10
重排分级排序
有时需要重新调整某条轴上各级别的顺序,或根据指定级别上的值对数据进行排序。swaplevel接受两个级别编号或名称,并返回一个互换了级别的新对象(但数据不会发生变化):
frame.swaplevel('key1','key2')Out[24]: state Ohio Coloradocolor Green Red Greenkey2 key1 1 a 0 1 22 a 3 4 51 b 6 7 82 b 9 10 11
sortlevel则根据单个级别中的值对数据进行排序。交换级别时,常用得到sortlevel,这样最终结果也是有序的了:
frame.swaplevel(0,1)Out[27]: state Ohio Coloradocolor Green Red Greenkey2 key1 1 a 0 1 22 a 3 4 51 b 6 7 82 b 9 10 11#交换级别0,1(也就是key1,key2)#然后对axis=0进行排序frame.swaplevel(0,1).sortlevel(0)__main__:1: FutureWarning: sortlevel is deprecated, use sort_index(level= ...)Out[28]: state Ohio Coloradocolor Green Red Greenkey2 key1 1 a 0 1 2 b 6 7 82 a 3 4 5 b 9 10 11
根据级别汇总统计
有时需要重新调整某条轴上各级别的顺序,或根据指定级别上的值对数据进行排序。swaplevel接受两个级别编号或名称,并返回一个互换了级别的新对象(但数据不会发生变化):
frame.sum(level='key2')Out[29]: state Ohio Coloradocolor Green Red Greenkey2 1 6 8 102 12 14 16frame.sum(level='color',axis=1)Out[30]: color Green Redkey1 key2 a 1 2 1 2 8 4b 1 14 7 2 20 10
使用DataFrame的列
将DataFrame的一个或多个列当做行索引来用,或将行索引变成Dataframe 的列。
frame=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]})frameOut[32]: a b c d0 0 7 one 01 1 6 one 12 2 5 one 23 3 4 two 04 4 3 two 15 5 2 two 26 6 1 two 3
DataFrame的set_index函数会将其一个或多个列转换为行索引,并创建一个新的DataFrame:
frame2=frame.set_index(['c','d'])frame2Out[34]: a bc d one 0 0 7 1 1 6 2 2 5two 0 3 4 1 4 3 2 5 2 3 6 1
默认情况下,那些列会从DataFrame中移除,但也可以将其保留下来:
frame.set_index(['c','d'],drop=False)Out[35]: a b c dc d one 0 0 7 one 0 1 1 6 one 1 2 2 5 one 2two 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.reset_index()Out[36]: c d a b0 one 0 0 71 one 1 1 62 one 2 2 53 two 0 3 44 two 1 4 35 two 2 5 26 two 3 6 1
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号