如何在pandas中使用ix
这篇文章将为大家详细讲解有关如何在pandas中使用ix,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
首先,再次介绍这三种方法的概述:
locgets rows (or columns) with particularlabelsfrom the index. loc从索引中获取具有特定标签的行(或列)。
ilocgets rows (or columns) at particularpositionsin the index (so it only takes integers).iloc在索引中的特定位置获取行(或列)(因此它只接受整数)。
ixusually tries to behave likelocbut falls back to behaving likeilocif 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 49NaN 48NaN 47NaN 46NaN 45NaN 1NaN 2NaN 3NaN 4NaN 5NaN
现在我们来看使用整数3切片有什么结果:
在这个例子中,s.iloc[:3]读取前3行(因为iloc把3看成是位置position),而s.loc[:3]读取的是前8行(因为loc把3看作是索引的标签label)
>>>s.iloc[:3]#slicethefirstthreerows 49NaN 48NaN 47NaN >>>s.loc[:3]#sliceuptoandincludinglabel3 49NaN 48NaN 47NaN 46NaN 45NaN 1NaN 2NaN 3NaN >>>s.ix[:3]#theintegerisintheindexsos.ix[:3]workslikeloc 49NaN 48NaN 47NaN 46NaN 45NaN 1NaN 2NaN 3NaN
注意:s.ix[:3]返回的结果与s.loc[:3]一样,这是因为如果series的索引是整型的话,ix会首先去寻找索引中的标签3而不是去找位置3。
如果,我们试图去找一个不在索引中的标签,比如说是6呢?
>>>s.iloc[:6] 49NaN 48NaN 47NaN 46NaN 45NaN 1NaN >>>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()#indexismixofdifferenttypes True >>>s2.ix[:6]#nowbehaveslikeilocgiveninteger aNaN bNaN cNaN dNaN eNaN 1NaN
注意:在这种情况下,ix也可以接受非整型,这样就是loc的操作:
>>>s2.ix[:'c']#behaveslikelocgivennon-integer aNaN bNaN cNaN
这个例子就说明了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 xyz89 aNaNNaNNaNNaNNaN bNaNNaNNaNNaNNaN cNaNNaNNaNNaNNaN dNaNNaNNaNNaNNaN eNaNNaNNaNNaNNaN
在pandas的早期版本(0.20.0)之前,ix可以很好地实现这个功能。
我们可以使用标签来切分行,使用位置来切分列(请注意:因为4并不是列的名字,因为ix在列上是使用的iloc)。
>>>df.ix[:'c',:4] xyz8 aNaNNaNNaNNaN bNaNNaNNaNNaN cNaNNaNNaNNaN
在pandas的后来版本中,我们可以使用iloc和其它的一个方法就可以实现上述功能:
>>>df.iloc[:df.index.get_loc('c')+1,:4] xyz8 aNaNNaNNaNNaN bNaNNaNNaNNaN cNaNNaNNaNNaN
get_loc()是得到标签在索引中的位置的方法。请注意,因为使用iloc切片时不包括最后1个点,因为我们必须加1。
可以看到,只使用iloc更好用,因为不必理会ix的那2个“繁琐”的特点。
关于如何在pandas中使用ix就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
推荐阅读
-
用pandas库中的diff()函数处理非平稳的时间序列
-
pandas中的concat函数如何实现索引重置
pandas中的concat函数如何实现索引重置这篇文章将为大家详...
-
pandas中的concat函数如何实现指定索引
pandas中的concat函数如何实现指定索引这篇文章主要介绍了...
-
Pandas Apply怎么用
PandasApply怎么用这篇文章将为大家详细讲解有关Pand...
-
Pandas中如何实现行的条件选择
Pandas中如何实现行的条件选择这篇文章主要介绍了Pandas...
-
Pandas数据存储的示例分析
Pandas数据存储的示例分析这篇文章主要为大家展示了“Panda...
-
Pandas数据类型的用法
-
Pandas数据类型之category的用法
Pandas数据类型之category的用法创建category使用Series创建在创建Series的同时添加dty...
-
Python(Pandas,pandas.read_sql函数实例用法)
Python,Pandas,pandas.read_sql函数实例用法Pandas是基于NumPy的一种工具,该工具是为...
-
Python(Pandas,pandas.read_sql_query函数实例用法分析)
Python,Pandas,pandas.read_sql_query函数实例用法分析Pandas是基于NumPy的一种...