欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

pandas中loc、iloc、ix的区别和使用

程序员文章站 2024-01-30 11:00:04
...

在利用pandas处理数据时loc、iloc、ix对数据的操作很频繁,所以这里简单的介绍一下它们之间的区别和各自的使用。

pandas的索引可归纳为3种

.loc,标签索引             (location)

.iloc,位置索引            (int-localtion)

.ix,标签与位置混合索引

        对于ix先按标签索引尝试操作,然后再按照位置索引尝试操作

注意

    DataFrame索引时可将其看作ndarray操作

    标签的切片索引是包含末尾位置

例子:

data = pd.DataFrame({'a':np.random.randint(1,10,size=5),'b':list('abacd')})
   a  b
0  6  a
1  7  b
2  7  a
3  4  c
4  3  d
In [5]: data['a']
Out[5]:
0    6
1    7
2    7
3    4
4    3
Name: a, dtype: int32

可以看出pandas的列是优先索引的。


In [8]: data[0:2]
Out[8]:
   a  b
0  6  a
1  7  b
如果我们直接使用切片来选择,可以看出它是对行的位置索引选择,并且不包含末尾位置。

loc:

In [6]: data.loc[0:2,'a']
Out[6]:
0    6
1    7
2    7

使用loc来标签索引,这里可以看出使用标签索引是包含切片末尾位置的,这是因为它将0:2中的0、1、2都当作了行标签,而不是数字。

iloc:

In [10]: data.iloc[1:3]
Out[10]:
   a  b
1  7  b
2  7  a

刚才我们说了,iloc它是按照位置来索引的,所以1:3是行的位置索引,并且不包含末为位置

如果我们使用loc标签索引来选择不存在的行标签会怎么样?

In [11]: data2 = pd.DataFrame({'x':[5,4,3,2,1],'y':[1,2,3,4,5]},index=list('abcde'))

In [12]: data2
Out[12]:
   x  y
a  5  1
b  4  2
c  3  3
d  2  4
e  1  5

我们使用loc来选择不存在的行标签:

data2.loc[1:3]
TypeError: cannot do slice indexing on <class 'pandas.core.indexes.base.Index'> with these indexers [1] of <class 'int'>

很明显的报错信息,它找不到1、2、3这三个标签。

同样再使用iloc会如何:

In [13]: data2.iloc[1:3]
Out[13]:
   x  y
b  4  2
c  3  3

可以正确选出结果。

ix:

In [15]: data2.ix[1:3]
Out[15]:
   x  y
b  4  2
c  3  3

ix前面我们说了它是混合索引,并且先按照标签进行索引,这里它没有找到对应标签,于是以位置进行索引,所以不包含末为位置。

In [16]: data2.ix['b':'c']
Out[16]:
   x  y
b  4  2
c  3  3

看,直接我们使用标签索引也能找到对应值,并且标签包含末为位置!

好了以上就是loc、iloc以及ix的简单使用和区别。


利用它们我们还可以在对行选择的同时对列进行选择,达到对数据的筛选目的.。

In [18]: data.loc[1:3,'a']
Out[18]:
1    7
2    7
3    4
Name: a, dtype: int32


df.loc[df['gender'] == 'male', 'label'] = 0

表示增加'label'列,且当df的'gender'为'male'时,其值赋为0。这在数据分析中将某些列转换为数值型的常用处理。