pandas中ix的使用详细讲解


Posted in Python onMarch 09, 2020

在上一篇博客中,我们已经仔细讲解了iloc和loc,只是简单了提到了ix。这是因为相比于前2者,ix更复杂,也更让人迷惑。

因此,本篇博客通过例子的解释试图来描述清楚ix,尤其是与iloc和loc的联系。

首先,再次介绍这三种方法的概述:

  • loc gets rows (or columns) with particular labels from the index. loc从索引中获取具有特定标签的行(或列)。
  • iloc gets rows (or columns) at particular positions in the index (so it only takes integers). iloc在索引中的特定位置获取行(或列)(因此它只接受整数)。
  • ix usually tries to behave like loc but falls back to behaving like iloc if a label is not present in the index. ix通常会尝试像loc一样行为,但如果索引中不存在标签,则会退回到像iloc一样的行为。(这句话有些绕口,没关系,关于ix特点,后面会详细讲解)

1 使用ix切分Series

请注意:在pandas版本0.20.0及其以后版本中,ix已经不被推荐使用,建议采用iloc和loc实现ix。这是为什么呢?这是由于ix的复杂特点可能使ix使用起来有些棘手:

  1. 如果索引是整数类型,则ix将仅使用基于标签的索引,而不会回退到基于位置的索引。如果标签不在索引中,则会引发错误。
  2. 如果索引不仅包含整数,则给定一个整数,ix将立即使用基于位置的索引而不是基于标签的索引。但是,如果ix被赋予另一种类型(例如字符串),则它可以使用基于标签的索引。

接下来举例说明这2个特点。

1.1 特点1举例

>>> s = pd.Series(np.nan, index=[49,48,47,46,45, 1, 2, 3, 4, 5])
>>> s
49 NaN
48 NaN
47 NaN
46 NaN
45 NaN
1 NaN
2 NaN
3 NaN
4 NaN
5 NaN

现在我们来看使用整数3切片有什么结果:

在这个例子中,s.iloc[:3]读取前3行(因为iloc把3看成是位置position),而s.loc[:3]读取的是前8行(因为loc把3看作是索引的标签label)

>>> s.iloc[:3] # slice the first three rows
49 NaN
48 NaN
47 NaN
 
>>> s.loc[:3] # slice up to and including label 3
49 NaN
48 NaN
47 NaN
46 NaN
45 NaN
1 NaN
2 NaN
3 NaN
 
>>> s.ix[:3] # the integer is in the index so s.ix[:3] works like loc
49 NaN
48 NaN
47 NaN
46 NaN
45 NaN
1 NaN
2 NaN
3 NaN

注意:s.ix[:3]返回的结果与s.loc[:3]一样,这是因为如果series的索引是整型的话,ix会首先去寻找索引中的标签3而不是去找位置3。

如果,我们试图去找一个不在索引中的标签,比如说是6呢?

>>> s.iloc[:6]
49 NaN
48 NaN
47 NaN
46 NaN
45 NaN
1 NaN
 
>>> s.loc[:6]
KeyError: 6
 
>>> s.ix[:6]
KeyError: 6

在上面的例子中,s.iloc[:6]正如我们所期望的,返回了前6行。而,s.loc[:6]返回了KeyError错误,这是因为标签6并不在索引中。

那么,s.ix[:6]报错的原因是什么呢?正如我们在ix的特点1所说的那样,如果索引只有整数类型,那么ix仅使用基于标签的索引,而不会回退到基于位置的索引。如果标签不在索引中,则会引发错误。

1.2 特点2举例

接着例子1来说,如果我们的索引是一个混合的类型,即不仅仅包括整型,也包括其他类型,如字符类型。那么,给ix一个整型数字,ix会立即使用iloc操作,而不是报KeyError错误。

>>> s2 = pd.Series(np.nan, index=['a','b','c','d','e', 1, 2, 3, 4, 5])
>>> s2.index.is_mixed() # index is mix of different types
True
>>> s2.ix[:6] # now behaves like iloc given integer
a NaN
b NaN
c NaN
d NaN
e NaN
1 NaN

注意:在这种情况下,ix也可以接受非整型,这样就是loc的操作:

>>> s2.ix[:'c'] # behaves like loc given non-integer
a NaN
b NaN
c NaN

这个例子就说明了ix特点2。

正如前面所介绍的,ix的使用有些复杂。如果仅使用位置或者标签进行切片,使用iloc或者loc就行了,请避免使用ix。

2 在Dataframe中使用ix实现复杂切片

有时候,在使用Dataframe进行切片时,我们想混合使用标签和位置来对行和列进行切片。那么,应该怎么操作呢?

举例,考虑有下述例子中的Dataframe。我们想得到直到包含标签'c'的行和前4列。

>>> df = pd.DataFrame(np.nan, 
      index=list('abcde'),
      columns=['x','y','z', 8, 9])
>>> df
 x y z 8 9
a NaN NaN NaN NaN NaN
b NaN NaN NaN NaN NaN
c NaN NaN NaN NaN NaN
d NaN NaN NaN NaN NaN
e NaN NaN NaN NaN NaN

在pandas的早期版本(0.20.0)之前,ix可以很好地实现这个功能。

我们可以使用标签来切分行,使用位置来切分列(请注意:因为4并不是列的名字,因为ix在列上是使用的iloc)。

>>> df.ix[:'c', :4]
 x y z 8
a NaN NaN NaN NaN
b NaN NaN NaN NaN
c NaN NaN NaN NaN

在pandas的后来版本中,我们可以使用iloc和其它的一个方法就可以实现上述功能:

>>> df.iloc[:df.index.get_loc('c') + 1, :4]
 x y z 8
a NaN NaN NaN NaN
b NaN NaN NaN NaN
c NaN NaN NaN NaN

get_loc() 是得到标签在索引中的位置的方法。请注意,因为使用iloc切片时不包括最后1个点,因为我们必须加1。

可以看到,只使用iloc更好用,因为不必理会ix的那2个“繁琐”的特点。

3 参考文献
https://stackoverflow.com/questions/31593201/pandas-iloc-vs-ix-vs-loc-explanation-how-are-they-different

到此这篇关于pandas中ix的使用详细讲解的文章就介绍到这了,更多相关pandas ix内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python读写Excel文件方法介绍
Nov 22 Python
使用Python的Bottle框架写一个简单的服务接口的示例
Aug 25 Python
Python使用自带的ConfigParser模块读写ini配置文件
Jun 26 Python
Python对多属性的重复数据去重实例
Apr 18 Python
Python实现的生产者、消费者问题完整实例
May 30 Python
python 并发编程 非阻塞IO模型原理解析
Aug 20 Python
自定义django admin model表单提交的例子
Aug 23 Python
nginx+uwsgi+django环境搭建的方法步骤
Nov 25 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
Feb 25 Python
Python tornado上传文件的功能
Mar 26 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
May 26 Python
Python基于network模块制作电影人物关系图
Jun 19 Python
Python unittest 自动识别并执行测试用例方式
Mar 09 #Python
python爬虫开发之urllib模块详细使用方法与实例全解
Mar 09 #Python
在Python IDLE 下调用anaconda中的库教程
Mar 09 #Python
python shell命令行中import多层目录下的模块操作
Mar 09 #Python
使用Python获取当前工作目录和执行命令的位置
Mar 09 #Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
Mar 09 #Python
Python如何存储数据到json文件
Mar 09 #Python
You might like
destoon整合ucenter后注册页面不跳转的解决方法
2014/06/21 PHP
PHP实现函数内修改外部变量值的方法示例
2018/12/28 PHP
PHP实现单条sql执行多个数据的insert语句方法
2019/10/11 PHP
如何运行/调试你的PHP代码
2020/10/23 PHP
flash 得到自身url参数的代码
2009/11/15 Javascript
JavaScript高级程序设计 阅读笔记(七) ECMAScript中的语句
2012/02/27 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
2013/12/12 Javascript
javascript运动效果实例总结(放大缩小、滑动淡入、滚动)
2016/01/08 Javascript
源码分析Vue.js的监听实现教程
2017/04/23 Javascript
关于页面刷新vuex数据消失问题解决方案
2017/07/03 Javascript
JavaScript中数组常见操作技巧
2017/09/01 Javascript
vue父组件向子组件(props)传递数据的方法
2018/01/02 Javascript
Vue2.0中集成UEditor富文本编辑器的方法
2018/03/03 Javascript
微信小程序云开发实现增删改查功能
2019/05/17 Javascript
vue 使用element-ui中的Notification自定义按钮并实现关闭功能及如何处理多个通知
2019/08/17 Javascript
js实现抽奖的两种方法
2020/03/19 Javascript
django中的HTML控件及参数传递方法
2018/03/20 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
2018/12/19 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
2019/06/14 Python
pycharm 批量修改变量名称的方法
2019/08/01 Python
Python+OpenCV实现将图像转换为二进制格式
2020/01/09 Python
python中pivot()函数基础知识点
2021/01/03 Python
python爬虫如何解决图片验证码
2021/02/14 Python
聊聊python在linux下与windows下导入模块的区别说明
2021/03/03 Python
html5 input元素新特性_动力节点Java学院整理
2017/07/06 HTML / CSS
Under Armour美国官网:美国知名高端功能性运动品牌
2016/09/05 全球购物
英国家电购物网站:Sonic Direct
2019/03/26 全球购物
Internet主要有哪些网络群组成
2015/12/24 面试题
12月红领巾广播稿
2014/02/13 职场文书
国贸专业自荐信范文
2014/03/02 职场文书
销售内勤岗位职责
2014/04/15 职场文书
白岩松演讲
2014/05/21 职场文书
八一建军节营销活动方案
2014/08/31 职场文书
个人遵守党的政治纪律情况对照检查材料思想汇报
2014/09/25 职场文书
2014年党员教师自我剖析材料
2014/09/30 职场文书
地球一小时活动总结
2015/02/27 职场文书