Python: pandas中ix的详细讲解
在上一篇博客中,我们已经仔细讲解了iloc和loc,只是简单了提到了ix。这是因为相比于前2者,ix更复杂,也更让人迷惑。
因此,本篇博客通过例子的解释试图来描述清楚ix,尤其是与iloc和loc的联系。
目录
1 使用ix切分Series
1.1 特点1举例
1.2 特点2举例
2 在Dataframe中使用ix实现复杂切片
3 参考文献
首先,再次介绍这三种方法的概述:
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 likeloc
but falls back to behaving likeiloc
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使用起来有些棘手:
- 如果索引是整数类型,则ix将仅使用基于标签的索引,而不会回退到基于位置的索引。如果标签不在索引中,则会引发错误。
- 如果索引不仅包含整数,则给定一个整数,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])
>>> dfx 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
Python: pandas中ix的详细讲解相关推荐
- python中ix用法_Python: pandas中ix的详细讲解
Python: pandas中ix的详细讲解 发布时间:2018-09-21 15:59, 浏览次数:2372 , 标签: Python pandas ix 在上一篇博客 中,我们已经仔细讲解了ilo ...
- python isdigit和isnumeric区别_isdigit()、isdecimal()和isnumeric python中区别【详细讲解】...
今天爱分享给大家带来isdigit().isdecimal()和isnumeric python中区别[详细讲解],希望能够帮助到大家. 1.函数介绍 isdecimal(...) | S.isdec ...
- isnumeric用法python_isdigit()、isdecimal()和isnumeric python中区别【详细讲解】
今天爱分享给大家带来isdigit().isdecimal()和isnumeric python中区别[详细讲解],希望能够帮助到大家. 1.函数介绍 isdecimal(...) | S.isdec ...
- Python的零基础超详细讲解(第十三天)-Python的类与对象
基础篇往期文章如下: Python的零基础超详细讲解(第一天)-Python简介以及下载 Python的零基础超详细讲解(第二天)-Python的基础语法1 Python的零基础超详细讲解(第三天)- ...
- Python的零基础超详细讲解(第十二天)-Python函数及使用
基础篇往期文章: Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博 ...
- Python的零基础超详细讲解(第七天)-Python的数据的应用
往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...
- Python的零基础超详细讲解(第五天)-Python的运算符
往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...
- python loc iloc,Python pandas loc用法与iloc区别 聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明...
想了解聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明的相关内容吗,Rainpages在本文为您仔细讲解Python pandas loc用法与iloc区别的相关知识和一些C ...
- 独家 | 浅谈Python/Pandas中管道的用法
作者:Gregor Scheithauer博士 翻译:王闯(Chuck)校对:欧阳锦本文约2000字,建议阅读5分钟本文介绍了如何在Python/Pandas中运用管道的概念,以使代码更高效易读. 图 ...
- 谈谈对python的理解_浅谈对python pandas中 inplace 参数的理解
这篇文章主要介绍了对python pandas中 inplace 参数的理解,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 pandas 中 inplace 参数在很多函数中都会有, ...
最新文章
- 新手如何学习云计算大数据,云计算的学习路线
- 产品经理提升修炼的方法
- tkinter窗口居中方法
- spray.json.JsonParser$ParsingException: Unexpected end-of-input at input index
- git 列出标签_Git标签介绍:如何在Git中列出,创建,删除和显示标签
- leetcode链表题
- 用jQuery插件jVectorMap制作中国省份区域图
- (30)FPGA原语设计(单端时钟转差分时钟)
- lnmp + swoole 安装
- [PHP] PHP+MYSQL留言板制作
- 浏览器Quirksmode(怪异模式)与CSScompat
- 极域电子教室卸载或安装软件后windows7无法启用触摸板、键盘
- 写给小白,Network Class
- 【unity发布webgl】遇到的问题和解决办法
- Quartz默认数据库表分析
- 永洪科技何春涛:中国企业数据技术的6大需求和解决之道
- 高频引力波数值计算matlab,李刚李莉张雏黄敬霞受热变形及系统优化分析J光.doc...
- Java 相关的技术摘要
- shell递归遍历目录中的所有文件、文件夹
- 吴裕雄--天生自然 诗经:小儿垂钓
热门文章
- 构建OctoberCMS插件:Google Analytics(分析)
- 43岁,转行当了大学老师
- 创建一个名为MyFileReader的类,设计一个方法 String read(String fileName, int n),该读取名为fileName的文件,返回文件中第n行的内容
- 谈一谈手游的运营与推广的那些事儿!
- 《后端》bug: java.lang.IllegalArgumentException: geronimo.jta.1.1.spec: Invalid module name: ‘1‘ is not
- Mac --显示隐藏文件
- 华为 服务器 驱动 linux,华为服务器SAS控制器驱动问题
- 自动动手打造绿色的Photoshop CS2
- 计算机网络第七版--概述知识点总结
- 使用清华镜像安装pytorch