iloc 是基於「位置」的Dataframe的操做,即主要基於下標的操做python
Pandas中的 iloc 是用基於整數的下標來進行數據定位/選擇
iloc 的語法是 data.iloc[<row selection>, <column selection>]
, iloc 在Pandas中是用來經過數字來選擇數據中具體的某些行和列。你能夠設想每一行都有一個對應的下標(0,1,2,...),經過 iloc 咱們能夠利用這些下標去選擇相應的行數據。同理,對於行也同樣,想象每一列也有對應的下標(0,1,2,...),經過這些下標也能夠選擇相應的列數據。web
在iloc中一共有 2 個 「參數」 -行選擇器 和 -列選擇器,例如:數組
# 使用DataFrame 和 iloc 進行單行/列的選擇 # 行選擇: data.iloc[0] # 數據中的第一行 data.iloc[1] # 數據中的第二行 data.iloc[-1] # 數據中的最後一行 # 列選擇: data.iloc[:, 0] # 數據中的第一列 data.iloc[:, 1] # 數據中的第二列 data.iloc[:, -1] # 數據中的最後一列
iloc 一樣能夠進行和列的混合選擇,例如:app
# 使用 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,具體例子看圖:
post
當你使用 [1:5] 這種語法對數據進行切片的時候,要注意只選擇了 1,2,3,4 這 4 個下標,而 5 並無被包括進去,即便用[x:y]選擇了下標從 x 到 y-1 的數據spa
實際工做中,其實不多用到 iloc ,除非你想選擇第一行( data.iloc[0] ) 或者 最後一行( data.iloc[-1] )code
能夠在如下2中狀況下使用 ioc:orm
使用 loc 的語法和 iloc 同樣:data.loc[<row selection>, <column selection>]
對象
使用 loc 進行數據選擇是基於下標的(若是有的話),可使用 df.set_index()
來設置下標, loc 方法直接經過下標來選擇行。
例如將"last_name"這一列設置爲下標:
data.set_index("last_name", inplace=True)
效果如圖:
如今咱們已經將下標設置爲"last_name",這樣咱們就能夠根據"last_name"選擇不一樣的數據了,使用 data.loc[<label>]
一樣的能夠查找單個值或者多個值,例子如圖:
注意,第一個樣例代碼返回的是 Series 類型,而第二個樣例代碼返回的是 DataFrame 類型,一樣你也能夠經過傳遞一個單值list來返回一個 DataFrame 類型的數據
固然也可使用 loc 對列進行選擇,同時能夠選擇對列使用 " : "進行切片選擇,效果如圖:
同時,你還可使用 " : " 對下標進行切片選擇,例如 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下標或者邏輯表達式,你能夠傳遞給 loc 一個值爲 True/False 的Series或者數組來選擇那些 Series或者數組中值爲 True 的行。
較多狀況下,語句 data["first_name" == 'Antonio']
會返回一個值爲 True/False 的 Series 類型數據,其中 "True" 表明這一行中的 "first_name" 值爲 "Antonio",這些 boolean數組能夠直接如圖所示傳遞給 loc 方法:
和以前同樣,能夠傳遞給 loc 第2個"參數"用來選擇某些列,能夠是列舉的列名,也能夠是用 " : " 切片的連續列,如圖:
一樣要注意:若是隻選擇了單獨的一列,返回的是 Series 類型,一樣傳遞一個單值list能夠返回 DataFrame 類型,如圖:
經過如下代碼能夠很好的理解 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 查詢數據那樣對數據進行修改,這個操做不會返回新的數據對象而是直接在原數據上進行修改。經過這個操做,你能夠根據不一樣的狀況對數據進行修改:
# 修改 'id' > 2000 的數據中的 'first_name' 爲 "John" data.loc[data['id'] > 2000, "first_name"] = "John"
如今pandas官方已經不推薦使用 ix 進行選擇了,而且將會在 0.20.1版本從Pandas中丟棄
做者:danielAck連接:https://www.jianshu.com/p/d6a9845a0a34來源:簡書簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。