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