pandas索引和選擇資料

sljwy發表於2020-12-28

使用pandas索引和選擇資料時,總是需要百度,因此決定對pandas.DataFrame中的索引和選擇方法做個總結。所用的pandas版本號為0.20.1
pandas中有三種索引方法:.loc.iloc[],注意:.ix的用法在0.20.0中已經不建議使用了!

下文中全部使用一個DataFrame來舉例:
這裡寫圖片描述

.loc用法

.loc主要是基於標籤(label)的,包括行標籤(index)和列標籤(columns),即行名稱和列名稱,可以使用df.loc[index_name,col_name],選擇指定位置的資料,其它的用法有:
1. 使用單個標籤。如果.loc[]中只有單個標籤,那麼選擇的是某一行。 df.loc[3]選擇的是index名為‘3’的一行,注意這裡的’3’是index的名稱,而不是序號
這裡寫圖片描述
2. 使用標籤的list:同樣是只選擇行
這裡寫圖片描述
3. 標籤的切片物件:與通常的python切片不同,在最終選擇的資料中包含切片的startstop
這裡寫圖片描述
4. 布林型的陣列:通常用於篩選符合某些條件的行
這裡寫圖片描述
這裡寫圖片描述
5. 可呼叫的函式
這裡寫圖片描述
lambda表示式語法:
lambda 傳入引數 : 返回的計算表示式

iloc用法

iloc是基於位置的索引,利用元素在各個軸上的索引序號進行選擇,序號超出範圍會產生IndexError,切片時允許序號超過範圍,用法包括:
1. 使用整數:與.loc相同,如果只使用一個維度,則對行選擇,下標從0開始
這裡寫圖片描述
2. 使用列表或陣列,同樣是對行選擇
這裡寫圖片描述
這裡寫圖片描述
3. 元素為整數的切片物件:與.loc不同的是,這裡下標為stop的資料不被選擇
這裡寫圖片描述
也可以對列進行切片:
這裡寫圖片描述
4. 使用布林陣列進行篩選:注意這裡可以使用list或者array,使用Series的話會出錯,NotImplementedError或者ValueError,前者是Series的index與待切片DataFrame的index不同時,後者是index相同時報的錯,可以自己實現體會一下。與.loc使用布林陣列,可以使用listarray,也可以使用Series,使用Series時index需要一致,否則會報IndexingError
這裡寫圖片描述
5.使用可呼叫函式
這裡寫圖片描述

切片操作[]

  • []操作只能輸入一個維度,不能用逗號隔開輸入兩個維度:
    這裡寫圖片描述

    1. 使用列名.lociloc只輸入一維時選取的是行,而[]選取的是列,並且必須使用列名
      這裡寫圖片描述
    2. 使用布林陣列:bool陣列的index需要和dataframe的index一致,此時選取的是行
      這裡寫圖片描述
      因此可以用來篩選符合條件的行:
      這裡寫圖片描述
  • 避免chained assignment
    在對資料賦值使可以有以下兩種操作:
    df.loc[df.C>0.5,'C']=0.6
    df[df.C>0.5][['C']]=0.6
    上面的操作可以在df上直接修改資料,而下面的操作被稱為chained assignment,會產生SettingWithCopyWarning,官網上的解釋:indexing-view-versus-copy。直觀來說就使用chained assignment無法預測是否能對資料df進行修改,使用loc一定是直接在df上修改資料,因此建議使用loc

相關文章