1. 程式人生 > >Pandas 中的四中索引方式詳解

Pandas 中的四中索引方式詳解

Pandas 中的四中索引方式詳解

第一次使用pandas 對於其中的Series 和DataFrame 的索引弄暈了,所以寫了這篇文章詳細的分析Pandas中的四中索引方式:1. 預設的索引[] 2.基於位置的索引.iloc 3.基於標籤的索引.loc[] 以及混合索引 .ix[]

  1. 預設索引方式需要看傳入內容,如果是數字那麼就是基於位置的索引,不會返回最後一個元素,如果是傳入的標籤,那麼就是標籤的索引,會返回最後一個元素。但是它只能識別其中一種。舉個例子,在DataFrame裡面會出現即使用標籤又使用位置的元素獲取方式,此時使用[] 獲取元素會出錯,因為它要麼識別標籤要麼識別位置,所以這個時候必須使用ix[] 混合索引才能夠正確的獲取元素。
  2. 基於位置索引,獲取數字對應的位置的資料,不會包含最後一個數字對應的內容
  3. 基於標籤的索引,返回標籤位對應的資料,會包含最後一個標籤對應的內容。注意在Series 以及DataFrame 中預設的行向,列項索引即可以當做標籤解析又可以當做位置解析。
  4. 混合索引。根據傳入內容會進行匹配,先按照標籤索引,再按照位置索引返回資料
    例項如下:
    如獲取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資料處理中比較重要的工具,利用索引進行資料操作也是非常普遍的。弄清楚其中的索引訪問方式還是比較重要的,呵呵。