层次化索引是pandas的一项重要功能,它使你能在一个轴上拥有多个(两个以上)索引级别。
创建一个Series,并用一个由列表或数组组成的列表作为索引。

  1. data=Series(np.random.randn(10),
  2. index=[['a','a','a','b','b','b','c','c','d','d'],
  3. [1,2,3,1,2,3,1,2,2,3]])
  4.  
  5. data
  6. Out[6]:
  7. a 1 -2.842857
  8. 2 0.376199
  9. 3 -0.512978
  10. b 1 0.225243
  11. 2 -1.242407
  12. 3 -0.663188
  13. c 1 -0.149269
  14. 2 -1.079174
  15. d 2 -0.952380
  16. 3 -1.113689
  17. dtype: float64

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

  1. data.index
  2. Out[7]:
  3. MultiIndex(levels=[['a', 'b', 'c', 'd'], [1, 2, 3]],
  4. labels=[[0, 0, 0, 1, 1, 1, 2, 2, 3, 3], [0, 1, 2, 0, 1, 2, 0, 1, 1, 2]])

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

  1. data['b']
  2. Out[8]:
  3. 1 0.225243
  4. 2 -1.242407
  5. 3 -0.663188
  6. dtype: float64
  7.  
  8. data['b':'c']
  9. Out[10]:
  10. b 1 0.225243
  11. 2 -1.242407
  12. 3 -0.663188
  13. c 1 -0.149269
  14. 2 -1.079174
  15. dtype: float64
  16.  
  17. data.ix[['b','d']]
  18. __main__:1: DeprecationWarning:
  19. .ix is deprecated. Please use
  20. .loc for label based indexing or
  21. .iloc for positional indexing
  22.  
  23. See the documentation here:
  24. http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated
  25. Out[11]:
  26. b 1 0.225243
  27. 2 -1.242407
  28. 3 -0.663188
  29. d 2 -0.952380
  30. 3 -1.113689
  31. dtype: float64

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

  1. data[:,2]
  2. Out[12]:
  3. a 0.376199
  4. b -1.242407
  5. c -1.079174
  6. d -0.952380
  7. dtype: float64
 
层次化索引在数据重塑和基于分组的操作中扮演重要角色。
可以通过unstack方法被重新安排到一个DataFrame中:

  1. data.unstack()
  2. Out[13]:
  3. 1 2 3
  4. a -2.842857 0.376199 -0.512978
  5. b 0.225243 -1.242407 -0.663188
  6. c -0.149269 -1.079174 NaN
  7. d NaN -0.952380 -1.113689
  8.  
  9. #unstack的逆运算是stack
  10. data.unstack().stack()
  11. Out[14]:
  12. a 1 -2.842857
  13. 2 0.376199
  14. 3 -0.512978
  15. b 1 0.225243
  16. 2 -1.242407
  17. 3 -0.663188
  18. c 1 -0.149269
  19. 2 -1.079174
  20. d 2 -0.952380
  21. 3 -1.113689
  22. dtype: float64

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

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

各层都可以有名字。如果指定了名称,它们会显示在控制台中(不要将索引名称和轴标签混为一谈!)

  1. frame.index.names=['key1','key2']
  2. frame.columns.names=['state','color']
  3.  
  4. frame
  5. Out[22]:
  6. state Ohio Colorado
  7. color Green Red Green
  8. key1 key2
  9. a 1 0 1 2
  10. 2 3 4 5
  11. b 1 6 7 8
  12. 2 9 10 11

由于有了分部的列索引,可以轻松选取列分组:

  1. frame['Ohio']
  2. Out[23]:
  3. color Green Red
  4. key1 key2
  5. a 1 0 1
  6. 2 3 4
  7. b 1 6 7
  8. 2 9 10
 
重排分级排序
有时需要重新调整某条轴上各级别的顺序,或根据指定级别上的值对数据进行排序。swaplevel接受两个级别编号或名称,并返回一个互换了级别的新对象(但数据不会发生变化):
  1. frame.swaplevel('key1','key2')
  2. Out[24]:
  3. state Ohio Colorado
  4. color Green Red Green
  5. key2 key1
  6. 1 a 0 1 2
  7. 2 a 3 4 5
  8. 1 b 6 7 8
  9. 2 b 9 10 11

sortlevel则根据单个级别中的值对数据进行排序。交换级别时,常用得到sortlevel,这样最终结果也是有序的了:

  1. frame.swaplevel(0,1)
  2. Out[27]:
  3. state Ohio Colorado
  4. color Green Red Green
  5. key2 key1
  6. 1 a 0 1 2
  7. 2 a 3 4 5
  8. 1 b 6 7 8
  9. 2 b 9 10 11
  10.  
  11. #交换级别0,1(也就是key1,key2)
  12. #然后对axis=0进行排序
  13. frame.swaplevel(0,1).sortlevel(0)
  14. __main__:1: FutureWarning: sortlevel is deprecated, use sort_index(level= ...)
  15. Out[28]:
  16. state Ohio Colorado
  17. color Green Red Green
  18. key2 key1
  19. 1 a 0 1 2
  20. b 6 7 8
  21. 2 a 3 4 5
  22. b 9 10 11
 
 
根据级别汇总统计
有时需要重新调整某条轴上各级别的顺序,或根据指定级别上的值对数据进行排序。swaplevel接受两个级别编号或名称,并返回一个互换了级别的新对象(但数据不会发生变化):

  1. frame.sum(level='key2')
  2. Out[29]:
  3. state Ohio Colorado
  4. color Green Red Green
  5. key2
  6. 1 6 8 10
  7. 2 12 14 16
  8.  
  9. frame.sum(level='color',axis=1)
  10. Out[30]:
  11. color Green Red
  12. key1 key2
  13. a 1 2 1
  14. 2 8 4
  15. b 1 14 7
  16. 2 20 10
使用DataFrame的列
将DataFrame的一个或多个列当做行索引来用,或将行索引变成Dataframe 的列。

  1. frame=DataFrame({'a':range(7),'b':range(7,0,-1),
  2. 'c':['one','one','one','two','two','two','two'],
  3. 'd':[0,1,2,0,1,2,3]})
  4.  
  5. frame
  6. Out[32]:
  7. a b c d
  8. 0 0 7 one 0
  9. 1 1 6 one 1
  10. 2 2 5 one 2
  11. 3 3 4 two 0
  12. 4 4 3 two 1
  13. 5 5 2 two 2
  14. 6 6 1 two 3

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

  1. frame2=frame.set_index(['c','d'])
  2.  
  3. frame2
  4. Out[34]:
  5. a b
  6. c d
  7. one 0 0 7
  8. 1 1 6
  9. 2 2 5
  10. two 0 3 4
  11. 1 4 3
  12. 2 5 2
  13. 3 6 1

默认情况下,那些列会从DataFrame中移除,但也可以将其保留下来:

  1. frame.set_index(['c','d'],drop=False)
  2. Out[35]:
  3. a b c d
  4. c d
  5. one 0 0 7 one 0
  6. 1 1 6 one 1
  7. 2 2 5 one 2
  8. two 0 3 4 two 0
  9. 1 4 3 two 1
  10. 2 5 2 two 2
  11. 3 6 1 two 3

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

  1. frame2.reset_index()
  2. Out[36]:
  3. c d a b
  4. 0 one 0 0 7
  5. 1 one 1 1 6
  6. 2 one 2 2 5
  7. 3 two 0 3 4
  8. 4 two 1 4 3
  9. 5 two 2 5 2
  10. 6 two 3 6 1

pandas--层次化索引的更多相关文章

  1. (三)pandas 层次化索引

    pandas层次化索引 1. 创建多层行索引 1) 隐式构造 最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组 Series也可以创建多层索引 import numpy ...

  2. pandas中层次化索引与切片

    Pandas层次化索引 1. 创建多层索引 隐式索引: 常见的方式是给dataframe构造函数的index参数传递两个或是多个数组 Series也可以创建多层索引 Series多层索引 B =Ser ...

  3. Pandas基本功能之层次化索引及层次化汇总

    层次化索引 层次化也就是在一个轴上拥有多个索引级别 Series的层次化索引 data=Series(np.random.randn(10),index=[ ['a','a','a','b','b', ...

  4. pandas:由列层次化索引延伸的一些思考

    1. 删除列层次化索引 用pandas利用df.groupby.agg() 做聚合运算时遇到一个问题:产生了列方向上的两级索引,且需要删除一级索引.具体代码如下: # 每个uesr每天消费金额统计:和 ...

  5. pandas(五)处理缺失数据和层次化索引

    pandas用浮点值Nan表示浮点和非浮点数组中的缺失数据.它只是一个便于被检测的标记而已. >>> string_data = Series(['aardvark','artich ...

  6. 利用Python进行数据分析(11) pandas基础: 层次化索引

      层次化索引 层次化索引指你能在一个数组上拥有多个索引,例如: 有点像Excel里的合并单元格对么? 根据索引选择数据子集   以外层索引的方式选择数据子集: 以内层索引的方式选择数据: 多重索引S ...

  7. 利用Python进行数据分析_Pandas_层次化索引

    申明:本系列文章是自己在学习<利用Python进行数据分析>这本书的过程中,为了方便后期自己巩固知识而整理. 层次化索引主要解决低纬度形式处理高纬度数据的问题 import pandas ...

  8. pandas重置索引的几种方法探究

    pandas重置索引的几种方法探究 reset_index() reindex() set_index() 函数名字看起来非常有趣吧! 不仅如此. 需要探究. http://nbviewer.jupy ...

  9. 关于groupby与层次化索引的联系和层次化标签的使用

    groupby出来对象并不是dataFrame,所以直接print是看不到矩阵或者高维矩阵的,所以需要用能够产生标量值的方法去处理groupby对象,这样可以利用矩阵形式处理高维数据: 这样group ...

  10. pandas 数据索引与选取

    我们对 DataFrame 进行选择,大抵从这三个层次考虑:行列.区域.单元格.其对应使用的方法如下:一. 行,列 --> df[]二. 区域   --> df.loc[], df.ilo ...

随机推荐

  1. arcpy-栅格转其他格式

    import arcpy in_format=arcpy.GetParameterAsText(0) out_format=arcpy.GetParameterAsText(1) out_folder ...

  2. git拉取远程所有分支

    第一步: git branch -r | grep -v '->' | while read remote; do git branch --track "${remote#origi ...

  3. LeetCode Array Easy 122. Best Time to Buy and Sell Stock II

    Description Say you have an array for which the ith element is the price of a given stock on day i. ...

  4. web集群和分布式服务以及消息补偿机制几种方案

    一.为什么要集群? 1.JavaEE项目,如果部署在一台Tomcat上,所有的请求,都由这一台服务器处理,存在很大风险: A:并发处理能力有限(一般单台服务器处理的并发量为250左右,超过250,可能 ...

  5. zookeeper常用配置详解

    #ZK中的一个时间单元.ZK中所有时间都是以这个时间单元为基础,进行整数倍配置的.例如,session的最小超时时间是2*tickTime tickTime=2000 #Follower在启动过程中, ...

  6. java多线程并发面试题

    1.多线程有什么用? (1)发挥多核CPU的优势 随着工业的进步,现在的笔记本.台式机乃至商用的应用服务器至少也都是双核的,4核.8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪 ...

  7. Java中的内部类怎么用

    一.为什么需要内部类?java内部类有什么好处?为什么需要内部类? 首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时 ...

  8. OpenSearch最新功能介绍

    摘要:阿里云开放搜索(OpenSearch)是一款结构化数据搜索托管服务,其能够提供简单.高效.稳定.低成本和可扩展的搜索解决方案.OpenSearch以平台服务化的形式,将专业搜索技术简单化.低门槛 ...

  9. 树分基础 bzoj 1468

    我们对于一棵树,我们找一个根,然后统计过这个点的路径有多少符合要求.怎么搞呢?我们可以先维护一个数据结构,然后把先把根作为一个距离自己为0的点放进去,然后对于每一棵子树,先找出所有的与之前的数据结构的 ...

  10. Tyvj 1518 CPU监控(线段树)

    题目描述: Bob需要一个程序来监视CPU使用率.这是一个很繁琐的过程,为了让问题更加简单,Bob会慢慢列出今天会在用计算机时做什么事. Bob会干很多事,除了跑暴力程序看视频之外,还会做出去玩玩和用 ...