pandas DataFrame的增刪查改總結系列文章:
在操作DataFrame時,肯定會經常用到loc,iloc,at等函數,各個函數看起來差不多,但是還是有很多區別的,我們一起來看下吧。
首先,還是列出一個我們用的DataFrame,注意index一列,如下:
接下來,介紹下各個函數的用法:
1、loc函數
願意看官方文檔的,請戳這里,這里一般最權威。
loc函數是基於“標簽”選擇數據的,但是也可以接受一個boolean的array,對於每個用法,我們從參數方面來一一舉例:
1.1 單個label
接受一個“標簽”(label)參數,返回一個Series,例如下面這個例子收一個標簽,返回通過這個標簽定位的行的值,注意這里是通過標簽定位,而不是通過中括號中的數字定位第幾行,之后我們通過對比iloc函數時還會細說。
test_dict_df.loc[1] #return the row with name 'Bob'
test_dict_df.loc[7] #return the row with name 'Time' important!!!
# type(test_dict_df.loc[1]) #pandas.core.series.Series
1.2 一個label的array
如果鍵入一個標簽的array,那么就返回一個對應的DataFrame:
test_dict_df.loc[[1,2,4]]
結果如下:
1.3 加入一個切片array
test_dict_df.loc[[1:4]]
結果如下:
1.4 行標簽,列標簽
通過在中括號中加入行標簽和列標簽來定位一個cell,相當於坐標的定位:
test_dict_df.loc[1,'english'] #result:94
1.5 行標簽或者列標簽是切片array
test_dict_df.loc[1:4,'english']
# test_dict_df.loc[1:4,'english':'math']
1.6 還可以接受條件,進行選擇
例如我們選擇英語成績超過90的所有行:
test_dict_df.loc[test_dict_df['english']>90]
當然,也可以再條件選擇后,再加入列選擇,列選擇的時候可以單列,也可以是切片數組,通過上面的介紹這里就可以靈活處理:
test_dict_df.loc[test_dict_df['english']>90,'english'] #single label
test_dict_df.loc[test_dict_df['english']>90,'english':'name'] #slice array
test_dict_df.loc[test_dict_df['english']>90,['english','name']] #label array
1.7 接受一個boolean的array
可以接受一個boolean的array,相當於按照這個表的真假按照位置的順序選擇值
test_dict_df.loc[[True,False,False,True]]
loc還有很多用法,這里先介紹到這里吧,當然如果你的DataFrame是復合的行或者復合列,寫法也是不同的,具體就可以查閱官方文檔了!
2、iloc函數
官方文檔戳這里。
iloc函數與loc函數不同的是,它接受的是一個數字,代表着要選擇數據的位置:
test_dict_df.iloc[6]
這代表我們選擇的是第6行,而不是index為6的那一行。當然,也可以接受一個boolean的array,相當於按照這個表的真假按照位置的順序選擇值:
test_dict_df.iloc[[True,False,False,True]]
這里iloc也可以接受切片array:
# test_dict_df.iloc[1:2]
test_dict_df.iloc[[1,2,4]]
3、ix函數(0.20.0版本后已經棄用)
ix就是一種混合索引,字符串的標簽和證書的數據索引都可以作為合法輸入,其實相當於loc和iloc的一個混合方法:
test_dict_df.ix['Alice']
test_dict_df.ix[1]
上述兩種方法都能得到值,這里我們就不追究這個函數具體是怎樣的檢索順序或者工作原理了。因為官方給出的是從pandas0.20.0之后,ix函數已經被棄用。其實在使用的時候,ix函數雖然方便,但是的確有時候會顯得比較混亂,所以我們之后也盡量少用這個函數吧,還是按照官方大佬的指導。
4、at函數
at是用來選擇單個值的,此時用法類似於loc:
test_dict_df.at[1,'english']
test_dict_df.loc[1,'english']
以上兩種方法都能選擇到,label為1,列為'english'的那個值,但是據說at速度要快,這點我沒有考證過。
5、iat函數
iat函數相對於at函數,就相當於iloc相對於loc函數。iat也只能選擇一個值。只不過是用索引位置來選擇,注意:行列都是索引位置來選擇,從0開始數。
# test_dict_df.iat[1,'english'] #error!!!
test_dict_df.iat[2,2] #right!!!
6、概括一下
最后我們概括一下:
1、 loc和iloc函數都是用來選擇某行的,iloc與loc的不同是:iloc是按照行索引所在的位置來選取數據,參數只能是整數。而loc是按照索引名稱來選取數據,參數類型依索引類型而定;
2、 at和iat函數是只能選擇某個位置的值,iat是按照行索引和列索引的位置來選取數據的。而at是按照行索引和列索引來選取數據;
3、 loc和iloc函數的功能包含at和iat函數的功能。
相應的代碼連接:github代碼
先寫到這里,如有新的再補充。