天天看點

pandas中loc、iloc、ix的差別和使用

在利用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。這在資料分析中将某些列轉換為數值型的常用處理。

繼續閱讀