pandas中loc-iloc-ix的使用

Pandas中loc,iloc,ix的使用

使用 iloc 從DataFrame中篩選數據

iloc 是基于“位置”的Dataframe的操作,即主要基于下標的操作

簡單使用

Pandas中的 iloc 是用基于整數的下標來進行數據定位/選擇
iloc 的語法是 data.iloc[<row selection>, <column selection>], iloc 在Pandas中是用來通過數字來選擇數據中具體的某些行和列。你可以設想每一行都有一個對應的下標(0,1,2,...),通過 iloc 我們可以利用這些下標去選擇相應的行數據。同理,對于行也一樣,想象每一列也有對應的下標(0,1,2,...),通過這些下標也可以選擇相應的列數據。

在iloc中一共有 2 個 “參數” -行選擇器-列選擇器,例如:

    # 使用DataFrame 和 iloc 進行單行/列的選擇
    # 行選擇:
    data.iloc[0] # 數據中的第一行
    data.iloc[1] # 數據中的第二行
    data.iloc[-1] # 數據中的最后一行
    
    # 列選擇:
    data.iloc[:, 0] # 數據中的第一列
    data.iloc[:, 1] # 數據中的第二列
    data.iloc[:, -1] # 數據中的最后一列 

行列混合選擇

iloc 同樣可以進行和列的混合選擇,例如:

    # 使用 iloc 進行行列混合選擇
    data.iloc[0:5] # 數據中的第 1-5 行
    data.iloc[:, 0:2] # 選擇數據中的前2列和所有行
    data.iloc[[0, 3, 6, 24], [0, 5, 6]] # 選擇第 1,4,7,25行 和 第 1,6,7 列
    data.iloc[0:5, 5:8] # 選擇第1-6行 和 6-9列

使用 iloc 注意以下兩點:

  • 如果使用iloc只選擇了單獨的一行會返回 Series 類型,而如果選擇了多行數據則會返回 DataFrame 類型,如果你只選擇了一行,但如果想要返回 DataFrame 類型可以傳入一個單值list,具體例子看圖:

    image

  • 當你使用 [1:5] 這種語法對數據進行切片的時候,要注意只選擇了 1,2,3,44 個下標,而 5 并沒有被包括進去,即使用[x:y]選擇了下標從 xy-1 的數據

實際工作中,其實很少用到 iloc ,除非你想選擇第一行( data.iloc[0] ) 或者 最后一行( data.iloc[-1] )

使用 loc 從DataFrame中篩選數據

可以在以下2中情況下使用 ioc

  • 使用 基于標簽(列頭)的下標的 查找
  • 使用 boolean / 有條件的 查找

使用 loc 的語法和 iloc 一樣:data.loc[<row selection>, <column selection>]

使用基于標簽(列頭)的下標數據選擇

使用 loc 進行數據選擇是基于下標的(如果有的話),可以使用 df.set_index() 來設置下標, loc 方法直接通過下標來選擇行。
例如將"last_name"這一列設置為下標:

    data.set_index("last_name", inplace=True)

效果如圖:


image

現在我們已經將下標設置為"last_name",這樣我們就可以根據"last_name"選擇不同的數據了,使用 data.loc[<label>]

同樣的可以查找單個值或者多個值,例子如圖:


image

注意,第一個樣例代碼返回的是 Series 類型,而第二個樣例代碼返回的是 DataFrame 類型,同樣你也可以通過傳遞一個單值list來返回一個 DataFrame 類型的數據

當然也可以使用 loc 對列進行選擇,同時可以選擇對列使用 " : "進行切片選擇,效果如圖:

image

同時,你還可以使用 " : " 對下標進行切片選擇,例如 data.loc['Bruch':'Julio'] 會選擇從下標為'Bruch'到下標為'Julio' 的所有行,例如:

    # 選擇下標值為'Andrade' 和 'Veness',并且從'city'到'email'的所有列
    data.loc[['Andrade', 'Veness'], ['city':'email']]
    # 選擇和之前相同的行,但只選擇'first_name', 'address' 和 'city'這3列
    data.loc['Andrade':'Veness', ['first_name', 'address', 'city']]

    # 將下標切換為'id'
    data.set_index('id', inplace=True) # 在原有數據源上修改
    # 選擇下標('id')= 487 的行
    data.loc[487]

注意:最后一行代碼:data.loc[487] 不等價于 data.iloc[487], 前者是選擇 'id' = 487 的行,而后者是選擇第488行,DataFrame的索引可以是數字順序的,也可以是字符串或多值的。

使用Boolean / 邏輯判斷選擇數據

使用 boolean 數組進行條件選擇是較為常用的手段,使用boolean下標或者邏輯表達式,你可以傳遞給 loc 一個值為 True/False 的Series或者數組來選擇那些 Series或者數組中值為 True 的行。

較多情況下,語句 data["first_name" == 'Antonio'] 會返回一個值為 True/False 的 Series 類型數據,其中 "True" 代表這一行中的 "first_name" 值為 "Antonio",這些 boolean數組可以直接如圖所示傳遞給 loc 方法:

image

和之前一樣,可以傳遞給 loc 第2個"參數"用來選擇某些列,可以是列舉的列名,也可以是用 " : " 切片的連續列,如圖:

image

同樣要注意:如果只選擇了單獨的一列,返回的是 Series 類型,同樣傳遞一個單值list可以返回 DataFrame 類型,如圖:

image

通過以下代碼可以很好的理解 loc 的使用:

    # 選擇 first_name 為Antonio,并且從 'city' 到 'email'的所有列
    data.loc[data['first_name'] == 'Antonio', 'city':'email']
 
    # 選擇那些 email的值中是以 "hotmail.com" 結尾的行,同時選擇所有列
    data.loc[data['email'].str.endswith("hotmail.com")]   
 
    # 選擇那些 "last_name" 等于某些值的行
    data.loc[data['first_name'].isin(['France', 'Tyisha', 'Eric'])]   
       
    # 選擇 first_name = 'Antonio' 并且 email 是以 "gmail.com"結尾的行
    data.loc[data['email'].str.endswith("gmail.com") & (data['first_name'] == 'Antonio')] 
 
    # select rows with id column between 100 and 200, and just return 'postal' and 'web' columns
    # 選擇那些 id 從100到200的行,并且只返回 'postal' 和 'web' 這兩列
    data.loc[(data['id'] > 100) & (data['id'] <= 200), ['postal', 'web']] 
 
    # lambda函數產生的 True/False 同樣可以使用到 loc 中
    # 選擇那些公司名為4個單詞的行
    data.loc[data['company_name'].apply(lambda x: len(x.split(' ')) == 4)] 
 
    # 為了代碼更加清晰, 選擇也可以在 .loc 之外進行
    # 在 .loc 之外單獨生成一個變量
    idx = data['company_name'].apply(lambda x: len(x.split(' ')) == 4)
    # 只選擇 idx 值為True的那些行,并且只選擇'email', 'first_name', 'company'這3列
    data.loc[idx, ['email', 'first_name', 'company']]

順便說一下Pandas中 map(), apply()applymap()的區別

  • map() 是 Series 中的函數,DataFrame 中是沒有 map() 的,map() 將函數應用于Series中的每一個元素

  • apply()applymap() 是 DataFrame 中的函數,而在Series中是沒有的。他們的區別在于: apply() 將函數作用于DataFrame中的 每一個行或者列,而 applymap() 會將函數作用于DataFrame中的 每一個元素

使用 loc 修改 DataFrame 中的數據

你可以像使用 loc 查詢數據那樣對數據進行修改,這個操作不會返回新的數據對象而是直接在原數據上進行修改。通過這個操作,你可以根據不同的情況對數據進行修改:

    # 修改 'id' > 2000 的數據中的 'first_name' 為 "John"
    data.loc[data['id'] > 2000, "first_name"] = "John"

使用 ix 進行選擇

現在pandas官方已經不推薦使用 ix 進行選擇了,并且將會在 0.20.1版本從Pandas中丟棄

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容