pandas中loc、iloc与ix索引方法的区别详解
本文详细解析pandas中loc、iloc和ix三种索引方法的区别。loc基于标签索引,包含切片末端;iloc基于整数位置索引,不包含切片末端;ix为混合模式。文章通过代码示例展示单行、多行及切片的具体应用,并指出ix在较新版本中已被弃用,建议优先使用loc和iloc以确保代码兼容性。
初学Python的numpy和pandas时,索引与切片机制常令人困惑,尤其是numpy中的切片、布尔索引及花式索引,情况较为复杂。随着Python版本从2.7升级至3.6,pandas引入了loc和iloc两种明确的索引方式,并逐步淘汰了ix方法。因此,有必要对这三种索引方法进行总结与对比,以理清其各自的使用场景。
- loc——基于行标签索引行数据
- iloc——基于行号索引行数据
- ix——基于行标签或行号索引行数据(结合loc与iloc的混合模式)
列数据的索引逻辑与行数据相同,同样适用上述三种方法。
以下通过具体示例进行说明:
1、分别使用loc、iloc、ix索引第一行的数据:
(1)使用loc
import pandas as pd data=[[1,2,3],[4,5,6]] index=['a','b']#行号 columns=['c','d','e']#列号 df=pd.DataFrame(data,index=index,columns=columns)#生成一个数据框 #print df.loc['a'] ''' c 1 d 2 e 3 ''' print df.loc[0] #这个就会出现错误 ''' TypeError: cannot do label indexing on <class 'pandas.indexes.base.Index'> with these indexers [1] of <type 'int'> '''
(2) 使用iloc
import pandas as pd data=[[1,2,3],[4,5,6]] index=['a','b']#行号 columns=['c','d','e']#列号 df=pd.DataFrame(data,index=index,columns=columns)#生成一个数据框 print df.iloc[0] ''' c 1 d 2 e 3 ''' print df.iloc['a'] ''' TypeError: cannot do positional indexing on <class 'pandas.indexes.base.Index'> with these indexers [a] of <type 'str'> '''
(3) 使用ix
import pandas as pd data=[[1,2,3],[4,5,6]] index=['a','b']#行号 columns=['c','d','e']#列号 df=pd.DataFrame(data,index=index,columns=columns)#生成一个数据框 print df.ix[0] ''' c 1 d 2 e 3 ''' print df.ix['a'] ''' c 1 d 2 e 3 '''
2、分别使用loc、iloc、ix索引第一列的数据:
import pandas as pd data=[[1,2,3],[4,5,6]] index=['a','b']#行号 columns=['c','d','e']#列号 df=pd.DataFrame(data,index=index,columns=columns)#生成一个数据框 print df.loc[:,['c']] print df.iloc[:,[0]] print df.ix[:,['c']] print df.ix[:,[0]] #结果都为 ''' c a 1 b 4 '''
3、分别使用loc、iloc、ix索引多行的数据:
import pandas as pd data=[[1,2,3],[4,5,6]] index=['a','b']#行号 columns=['c','d','e']#列号 df=pd.DataFrame(data,index=index,columns=columns)#生成一个数据框 print df.loc['a':'b'] print df.iloc[0:1] print df.ix['a':'b'] print df.ix[0:1] #结果都为 ''' c d e a 1 2 3 b 4 5 6 '''
4、分别使用loc、iloc、ix索引多列的数据:
import pandas as pd data=[[1,2,3],[4,5,6]] index=['a','b']#行号 columns=['c','d','e']#列号 df=pd.DataFrame(data,index=index,columns=columns)#生成一个数据框 print df.loc[:,'c':'d'] print df.iloc[:,0:2] print df.ix[:,'c':'d'] print df.ix[:,0:2] #结果都为 ''' c d a 1 2 b 4 5 '''
5、loc、iloc、ix在切片使用上的区别
loc、iloc和ix在处理切片索引时主要涉及两种情况:按标签切片和按位置编号切片。
In [20]: df.loc['ind0':'ind3'] Out[20]: col0 col1 col2 col3 col4 ind0 0 1 2 3 4 ind1 5 6 7 8 9 ind2 10 11 12 13 14 ind3 15 16 17 18 19 In [21]: df.iloc[0:3] Out[21]: col0 col1 col2 col3 col4 ind0 0 1 2 3 4 ind1 5 6 7 8 9 ind2 10 11 12 13 14
核心区别不在于方法本身,而在于切片末端是否包含:通过标签索引时,切片末端会被包含;通过位置编号索引时,切片末端不被包含。例如,选取第1行至第4行数据,loc会提取第1、2、3、4行,而iloc仅提取第1、2、3行。ix方法的行为逻辑与二者类似,具体表现取决于传入参数的类型。
In [23]: df.ix['ind0':'ind3'] Out[23]: col0 col1 col2 col3 col4 ind0 0 1 2 3 4 ind1 5 6 7 8 9 ind2 10 11 12 13 14 ind3 15 16 17 18 19 In [24]: df.ix[0:3] Out[24]: col0 col1 col2 col3 col4 ind0 0 1 2 3 4 ind1 5 6 7 8 9 ind2 10 11 12 13 14
列的切片规则与行切片完全一致。
本文讨论了基本的索引和切片操作,若存在用词不当之处,欢迎指正。此外,关于花式索引、布尔索引等相关问题,也欢迎共同探讨。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













