本篇博客通过例子的解释试图来描述清楚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使用起来有些棘手:

如果索引是整数类型,则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])

>>> 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个“繁琐”的特点。

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

python中ix用法_pandas中ix的使用详细讲解相关推荐

  1. python中columns用法_pandas中DataFrame修改index、columns名的方法示例

    一般常用的有两个方法: 1.使用DataFrame.index = [newName],DataFrame.columns = [newName],这两种方法可以轻松实现. 2.使用rename方法( ...

  2. pandas中drop用法_pandas中drop()函数用法

    函数定义:DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplace=False) 删除单个行 import pandas ...

  3. python的继承用法_python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

  4. python if函数用法_python中if条件中的Contains()函数“in”

    我对contains()in的功能做了一些研究,特别是与eq()==进行了比较,发现它可以完成许多任务.我设法回答了其中许多问题(见下文). 除了下面的用法之外,in还有其他有用的用法吗,例如对象?在 ...

  5. python中sorted用法_Python中sorted()方法的用法

    1.先说一下iterable,中文意思是迭代器. Python的帮助文档中对iterable的解释是:iteralbe指的是能够一次返回它的一个成员的对象.iterable主要包括3类: 第一类是所有 ...

  6. python中rjust用法_python中rjust的用法

    英文对话是要加引号的,而且是双引号和单引号的使用方法与中文一样的用法,接下来小编在这里给大家带来,我们一起来看看吧!引号分单引号(singlequotationmarks)和双引号(doublequo ...

  7. for循环在c++中的用法_C ++中的循环

    for循环在c++中的用法 Loops come into picture when we need to execute a particular action in a repeated mann ...

  8. oracle中rollback用法,Oracle中SAVEPOINT和ROLLBACK用法

    savepoint是事务内部允许部分rollback的标志符.因为事务中对记录做了修改,我们可以在事务中创建savepoint来标识不同的点.如果遇到错误,就可以rollback到不同的点或直接回来事 ...

  9. oracle中using用法,Oracle中Using用法

    Oracle中Using用法 1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数 ...

  10. oracle中%type用法,oracle中declare用法

    第8 章 函数与存储过程 Oracle数据库中不仅可以使用单条语句对数据库进行 数据库中不仅可以使用单条语句对数据库进行 查操作,而且可以多条语句组成一个语句块, 增.删.改.查操作,而且可以多条语句 ...

最新文章

  1. 笑出腹肌的注释,都是被代码耽误的诗人!
  2. 商城开发(1)-前期准备
  3. Nature年度十大杰出论文公布:机器狗算法、近室温超导等入选,复旦中科院上榜...
  4. html 注册插件,HTML 插件
  5. Cortex-M3-中断/异常的响应序列
  6. why in GM0 our extension component this.sPath is not correct
  7. emacs中安装markdown-mode
  8. faster rcnn的tensorflow代码的理解
  9. 画时序图软件 TimeGen 3.2 TimingDesigner 9.103 AndyTiming
  10. C++ std::condition_variable wait() wait_for() 区别 怎么用 实例
  11. c语言习题集(含答案)
  12. 如何有效管理远程开发团队
  13. overload java_Java方法重载Overload原理及使用解析
  14. 电子计算机的发展和应用教案,第1课 追寻发展的足迹——计算机的发展与应用...
  15. Airbnb如何应用AARRR策略成为全球第一民宿平台
  16. integrate函数python_python – Sympy:integrate()奇怪的输出
  17. 趣店预制菜爆火背后,是一场慢节奏的长期主义
  18. CAD 批量打印,输出pdf,plt的工具
  19. chrome-调试按钮详解
  20. guido正式对外发布python版本的年份_Guido van Rossum正式对外发布Python版本的年份是:______。...

热门文章

  1. Stellarium(虚拟天文馆)
  2. 调用个人微信API接口协议实现群发好友,群发群
  3. 观《五星大饭店》有感
  4. 声律启蒙(上 下卷,珍藏版)
  5. java duplicate key_java.lang.IllegalStateException: Duplicate key 1
  6. Python——click模块
  7. 计算机网络未识别网络,电脑网络连接出现未识别的网络怎么办
  8. 软件测试带宽低,性能测试分析之带宽瓶颈的疑惑
  9. win7系统不能保存文档到服务器,win7 64位系统编辑word文档后无法保存的解决方法...
  10. IE 11 无法安全地连接到此页面