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实现通过哈希算法检测图片重复的教程
Apr 02 Python
利用python生成一个导出数据库的bat脚本文件的方法
Dec 30 Python
python 实现数组list 添加、修改、删除的方法
Apr 04 Python
python实现遍历文件夹修改文件后缀
Aug 28 Python
使用python Fabric动态修改远程机器hosts的方法
Oct 26 Python
计算机二级python学习教程(1) 教大家如何学习python
May 16 Python
python向字符串中添加元素的实例方法
Jun 28 Python
搭建python django虚拟环境完整步骤详解
Jul 08 Python
Series和DataFrame使用简单入门
Nov 13 Python
导致python中import错误的原因是什么
Jul 01 Python
python能做哪些生活有趣的事情
Sep 09 Python
python调用ffmpeg命令行工具便捷操作视频示例实现过程
Nov 01 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
PHP封装的MSSql操作类完整实例
2016/05/26 PHP
php reset() 函数指针指向数组中的第一个元素并输出实例代码
2016/11/21 PHP
PHP实现会员账号单唯一登录的方法分析
2019/03/07 PHP
javascript 类型判断代码分析
2010/03/28 Javascript
JavaScript具有类似Lambda表达式编程能力的代码(改进版)
2010/09/14 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
2013/01/23 Javascript
JS将表单导出成EXCEL的实例代码
2013/11/11 Javascript
js代码实现随机颜色的小方块
2015/07/30 Javascript
jQuery实现多级下拉菜单jDropMenu的方法
2015/08/28 Javascript
JS实现的车标图片提示效果代码
2015/10/10 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
利用node.js实现自动生成前端项目组件的方法详解
2017/07/12 Javascript
Vue v2.5 调整和更新不完全问题
2017/10/24 Javascript
Vue中使用ElementUI使用第三方图标库iconfont的示例
2018/10/11 Javascript
vue-router启用history模式下的开发及非根目录部署方法
2018/12/23 Javascript
React精髓!一篇全概括小结(急速)
2019/05/23 Javascript
vue实现页面滚动到底部刷新
2019/08/16 Javascript
Vue3.x源码调试的实现方法
2019/10/13 Javascript
JavaScript实现字符串与HTML格式相互转换
2020/03/17 Javascript
微信小程序实现自定义底部导航
2020/11/18 Javascript
python写的ARP攻击代码实例
2014/06/04 Python
Python代码的打包与发布详解
2014/07/30 Python
利用python求解物理学中的双弹簧质能系统详解
2017/09/29 Python
pandas 取出表中一列数据所有的值并转换为array类型的方法
2018/04/11 Python
python3写的简单本地文件上传服务器实例
2018/06/04 Python
调试Django时打印SQL语句的日志代码实例
2019/09/12 Python
解决python-docx打包之后找不到default.docx的问题
2020/02/13 Python
Python文件时间操作步骤代码详解
2020/04/13 Python
瑞典网上购买现代和复古家具:Reforma
2019/10/21 全球购物
金融事务专业毕业生求职信
2014/02/23 职场文书
《陈毅探母》教学反思
2014/05/01 职场文书
课外访万家心得体会
2014/09/03 职场文书
学习党的群众路线剖析材料
2014/10/09 职场文书
2015年六一儿童节活动方案
2015/05/05 职场文书
家长会感言
2015/08/01 职场文书
创业项目大全(适合在家创业的项目)
2019/08/15 职场文书