pandas 层次化索引的实现方法


Posted in Python onJuly 06, 2019

层次化索引是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]])

data
Out[6]: 
a 1  -2.842857
  2  0.376199
  3  -0.512978
b 1  0.225243
  2  -1.242407
  3  -0.663188
c 1  -0.149269
  2  -1.079174
d 2  -0.952380
  3  -1.113689
dtype: float64

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

data.index
Out[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.225243
2  -1.242407
3  -0.663188
dtype: float64


data['b':'c']
Out[10]: 
b 1  0.225243
  2  -1.242407
  3  -0.663188
c 1  -0.149269
  2  -1.079174
dtype: float64

data.ix[['b','d']]
__main__:1: DeprecationWarning: 
.ix is deprecated. Please use
.loc for label based indexing or
.iloc for positional indexing

See the documentation here:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated
Out[11]: 
b 1  0.225243
  2  -1.242407
  3  -0.663188
d 2  -0.952380
  3  -1.113689
dtype: float64

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

data[:,2]
Out[12]: 
a  0.376199
b  -1.242407
c  -1.079174
d  -0.952380
dtype: float64

层次化索引在数据重塑和基于分组的操作中扮演重要角色。

可以通过unstack方法被重新安排到一个DataFrame中:

data.unstack()
Out[13]: 
     1     2     3
a -2.842857 0.376199 -0.512978
b 0.225243 -1.242407 -0.663188
c -0.149269 -1.079174    NaN
d    NaN -0.952380 -1.113689


#unstack的逆运算是stack
data.unstack().stack()
Out[14]: 
a 1  -2.842857
  2  0.376199
  3  -0.512978
b 1  0.225243
  2  -1.242407
  3  -0.663188
c 1  -0.149269
  2  -1.079174
d 2  -0.952380
  3  -1.113689
dtype: 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']])

frame
Out[16]: 
   Ohio   Colorado
  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.columns.names=['state','color']

frame
Out[22]: 
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

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

frame['Ohio']
Out[23]: 
color   Green Red
key1 key2      
a  1     0  1
   2     3  4
b  1     6  7
   2     9  10

重排分级排序

有时需要重新调整某条轴上各级别的顺序,或根据指定级别上的值对数据进行排序。swaplevel接受两个级别编号或名称,并返回一个互换了级别的新对象(但数据不会发生变化):

frame.swaplevel('key1','key2')
Out[24]: 
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

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

frame.swaplevel(0,1)
Out[27]: 
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

#交换级别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   Colorado
color   Green Red  Green
key2 key1          
1  a    0  1    2
   b    6  7    8
2  a    3  4    5
   b    9 10    11

根据级别汇总统计

有时需要重新调整某条轴上各级别的顺序,或根据指定级别上的值对数据进行排序。swaplevel接受两个级别编号或名称,并返回一个互换了级别的新对象(但数据不会发生变化):

frame.sum(level='key2')
Out[29]: 
state Ohio   Colorado
color Green Red  Green
key2          
1     6  8    10
2    12 14    16

frame.sum(level='color',axis=1)
Out[30]: 
color   Green Red
key1 key2      
a  1     2  1
   2     8  4
b  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]})

frame
Out[32]: 
  a b  c d
0 0 7 one 0
1 1 6 one 1
2 2 5 one 2
3 3 4 two 0
4 4 3 two 1
5 5 2 two 2
6 6 1 two 3

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

frame2=frame.set_index(['c','d'])

frame2
Out[34]: 
    a b
c  d   
one 0 0 7
  1 1 6
  2 2 5
two 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 d
c  d       
one 0 0 7 one 0
  1 1 6 one 1
  2 2 5 one 2
two 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 b
0 one 0 0 7
1 one 1 1 6
2 one 2 2 5
3 two 0 3 4
4 two 1 4 3
5 two 2 5 2
6 two 3 6 1

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python用ConfigObj读写配置文件的实现代码
Mar 04 Python
python备份文件以及mysql数据库的脚本代码
Jun 10 Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
Jun 20 Python
Python3实现的画图及加载图片动画效果示例
Jan 19 Python
Python OpenCV中的resize()函数的使用
Jun 20 Python
python高斯分布概率密度函数的使用详解
Jul 10 Python
Win系统PyQt5安装和使用教程
Dec 25 Python
python 实现简单的FTP程序
Dec 27 Python
Python 日期的转换及计算的具体使用详解
Jan 16 Python
TensorBoard 计算图的可视化实现
Feb 15 Python
Python tkinter布局与按钮间距设置方式
Mar 04 Python
浅谈pytorch中stack和cat的及to_tensor的坑
May 20 Python
pandas删除行删除列增加行增加列的实现
Jul 06 #Python
Python使用Pandas库实现MySQL数据库的读写
Jul 06 #Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
Jul 06 #Python
Python 微信爬虫完整实例【单线程与多线程】
Jul 06 #Python
python实现爬取百度图片的方法示例
Jul 06 #Python
python实现控制电脑鼠标和键盘,登录QQ的方法示例
Jul 06 #Python
python3 打印输出字典中特定的某个key的方法示例
Jul 06 #Python
You might like
微信公众平台消息接口校验与消息接口响应实例
2014/12/23 PHP
smarty模板判断数组为空的方法
2015/06/10 PHP
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
Symfony核心类概述
2016/03/17 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
2016/04/21 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
关于laravel框架中的常用目录路径函数
2019/10/23 PHP
Javascript获取窗口(容器)的大小及位置参数列举及简要说明
2012/12/09 Javascript
windows系统下简单nodejs安装及环境配置
2013/01/08 NodeJs
THREE.JS入门教程(5)你应当知道的十件事
2013/01/24 Javascript
3种不同方式的焦点图轮播特效分享
2013/10/30 Javascript
JS实现浏览器状态栏文字从右向左弹出效果代码
2015/10/27 Javascript
js实现文字闪烁特效的方法
2015/12/17 Javascript
BootStrap和jQuery相结合实现可编辑表格
2016/04/21 Javascript
js与applet相互调用的方法
2016/06/22 Javascript
JavaScript中String对象的方法介绍
2017/01/04 Javascript
nodejs+express实现文件上传下载管理网站
2017/03/15 NodeJs
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
2018/12/19 Javascript
微信小程序开发之左右分栏效果的实例代码
2019/05/20 Javascript
Node.js实现简单的爬取的示例代码
2019/06/25 Javascript
JavaScript 实现拖拽效果组件功能(兼容移动端)
2020/11/11 Javascript
JavaScript实现跟随鼠标移动的盒子
2021/01/28 Javascript
Web服务器框架 Tornado简介
2014/07/16 Python
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
python paramiko模块学习分享
2017/08/23 Python
Python 3实战爬虫之爬取京东图书的图片详解
2017/10/09 Python
用Python将mysql数据导出成json的方法
2018/08/21 Python
Python pycharm 同时加载多个项目的方法
2019/01/17 Python
Django 项目重命名的实现步骤解析
2019/08/14 Python
Python shutil模块用法实例分析
2019/10/02 Python
Python @property及getter setter原理详解
2020/03/31 Python
CSS3实现DIV圆角效果完整代码
2012/10/10 HTML / CSS
英国知名衬衫品牌美国网站:Charles Tyrwhitt美国
2016/08/28 全球购物
俄罗斯最大的香水和化妆品网上商店:Randewoo
2020/11/05 全球购物
2014购房个人委托书范本
2014/10/12 职场文书
2019入党申请书格式
2019/06/25 职场文书