Pandas 中的四中索引方式詳解
阿新 • • 發佈:2018-12-05
Pandas 中的四中索引方式詳解
第一次使用pandas 對於其中的Series 和DataFrame 的索引弄暈了,所以寫了這篇文章詳細的分析Pandas中的四中索引方式:1. 預設的索引[] 2.基於位置的索引.iloc 3.基於標籤的索引.loc[] 以及混合索引 .ix[]
- 預設索引方式需要看傳入內容,如果是數字那麼就是基於位置的索引,不會返回最後一個元素,如果是傳入的標籤,那麼就是標籤的索引,會返回最後一個元素。但是它只能識別其中一種。舉個例子,在DataFrame裡面會出現即使用標籤又使用位置的元素獲取方式,此時使用[] 獲取元素會出錯,因為它要麼識別標籤要麼識別位置,所以這個時候必須使用ix[] 混合索引才能夠正確的獲取元素。
- 基於位置索引,獲取數字對應的位置的資料,不會包含最後一個數字對應的內容
- 基於標籤的索引,返回標籤位對應的資料,會包含最後一個標籤對應的內容。注意在Series 以及DataFrame 中預設的行向,列項索引即可以當做標籤解析又可以當做位置解析。
- 混合索引。根據傳入內容會進行匹配,先按照標籤索引,再按照位置索引返回資料
例項如下:
如獲取Series 中的部分資料
s_obj1 = pd.Series(np.arange(5),index=['a','b','c','d','e'])
print s_obj1
print s_obj1['a':'b'] # 使用標籤索引
print s_obj1[0:2] # 使用位置索引
dic1 = {2011:'hello',2012:'yes',2013:'fff'} # 此時2011 2012 2013 為標籤
s_obj2 = pd.Series(dic1)
print s_obj2
print s_obj2[2011:2013] # 沒有內容
print s_obj2.loc[2011:2013] # 使用標籤索引
print s_obj2.ix[2011:2013] # 使用混合索引返回同樣內容,當做標籤解析
輸出結果如下:
a 0
b 1
c 2
d 3
e 4
dtype: int32
a 0
b 1
dtype: int32
a 0
b 1
dtype: int32
2011 hello
2012 yes
2013 fff
dtype: object
Series([], dtype: object)
2011 hello
2012 yes
2013 fff
dtype: object
2011 hello
2012 yes
2013 fff
dtype: object
和預想的一樣。使用dict構建Series的時候其中key為標籤。可以通過標籤索引獲取,而直接傳遞數值會被當做位置索引,所以獲取不到資料。
在DataFrame上面的實驗如下:
dic2 = {
'A':1,
'B':pd.Series(np.arange(4),index=list(range(4)),dtype='float32'),
'C':'hello',
'D':pd.Timestamp('2017')
}
df_obj1 = pd.DataFrame(dic2)
print df_obj1
# print df_obj1[0:3,0:2]# 報錯,無法正常實現分片操作 需要使用df_obj1.loc[0:3,0:2] 成功獲取資料 不知道為什麼不能夠當做位置索引獲取資料
print df_obj1[[0,1]] # 使用位置獲取不連續索引資料
print df_obj1[[2]] # 如果使用位置索引獲取單列(Series) 需要傳遞list型資料,比較特殊
print df_obj1['C'] # 和上面獲取同樣內容,使用列標籤獲取
print df_obj1.ix[0:3,0:2] # 獲取四行兩列資料 行向索引可以當成標籤訪問
print df_obj1.iloc[0:3,0:2] # 獲取三行兩列資料 純位置索引
實驗結果如下:
A B C D
0 1 0.0 hello 2017-01-01
1 1 1.0 hello 2017-01-01
2 1 2.0 hello 2017-01-01
3 1 3.0 hello 2017-01-01
A B
0 1 0.0
1 1 1.0
2 1 2.0
3 1 3.0
C
0 hello
1 hello
2 hello
3 hello
0 hello
1 hello
2 hello
3 hello
Name: C, dtype: object
A B
0 1 0.0
1 1 1.0
2 1 2.0
3 1 3.0
A B
0 1 0.0
1 1 1.0
2 1 2.0
和預測結果一樣
總結
Pandas 是python資料處理中比較重要的工具,利用索引進行資料操作也是非常普遍的。弄清楚其中的索引訪問方式還是比較重要的,呵呵。