【Python】50個Pandas的奇淫技巧:一網(wǎng)打盡各種索引 iloc,loc,ix,iat,at…
數(shù)據(jù)處理,也是風(fēng)控非常重要的一個環(huán)節(jié),甚至說是模型成敗的關(guān)鍵環(huán)節(jié)。因此,嫻熟簡潔的數(shù)據(jù)處理技巧,是提高建模效率和建模質(zhì)量的必要能力。這里開個專題,總結(jié)下Pandas的使用方法,方便大家,也方便自己查閱。
這個專題叫做:【50個Pandas的奇淫技巧】,今天這個算是第一講,后續(xù)慢慢更新。
一、Pandas索引概述
很多人在使用Pandas處理數(shù)據(jù)時,總會迷失在data[]、iloc()、loc()、ix()中,似乎記得,又似乎不記得,每到用時都需要百度,不知所以然的解決了問題,下次繼續(xù)百度,記憶點(diǎn)基本上非常混亂??偨Y(jié)本文,希望能解決這個問題,通過一個簡單的案例徹底搞明白這幾種索引方法到底有什么區(qū)別。
日常使用中,推薦使用loc和iloc進(jìn)行索引,loc是指location的意思,iloc中的 i 是指integer,這兩個方法容易混淆,可以使用特殊方式來加強(qiáng)記憶。
iloc:基于位置,用行號、列號進(jìn)行索引,i 可以看著 int,因此 iloc 只能用整數(shù) 來索引,例如data.iloc[0:2,:]
loc :基于標(biāo)簽,用行名、列名進(jìn)行索引,數(shù)據(jù)的index經(jīng)常為整數(shù),因此 loc 的使用范圍要遠(yuǎn)高于iloc,loc可以使用整數(shù)切片、名稱(index,columns)索引、也可以切片和名稱混合使用。例如:data.loc[0:5:,'row1':'row2']
我們簡單構(gòu)造一個數(shù)據(jù)集,在下面的案例中需要用到。
import pandas as pdimport numpy as npdata = pd.DataFrame(np.arange(25).reshape(5, 5),index = ['row1', 'row2','row3','row4','row5'],columns=['col1', 'col2','col3','col4','col5'])datacol1 col2 col3 col4 col5row1 0 1 2 3 4row2 5 6 7 8 9row3 10 11 12 13 14row4 15 16 17 18 19row5 20 21 22 23 24
創(chuàng)建的表格數(shù)據(jù)如下:

二、直接用列名索引
取一列:data['col1'] ,即取得第一列,得到的是一個Series對象。
取多列:data[['col1','col2']] ,即取得第一列、第二列,得到的是一個DataFrame對象。
注 意:用data['row1'] 、data[0]、data[:,0]、data[0,:]、data[:,'col1':'col2'] 統(tǒng)統(tǒng)都會報錯的,這類命令只能用來按列名取一列或多列。
data['col1']row1 0row2 5row3 10row4 15row5 20

data[['col1','col2']]col1 col2row1 0 1row2 5 6row3 10 11row4 15 16row5 20 21#下面的命令直接應(yīng)用都會報錯,但是用loc 和 iloc 就不會報錯data['row1']data[0]data[:,0]data[0,:]data[:,'col1':'col2']#TypeError: '(slice(None, None, None), 0)' is an invalid ke

三、直接用行號索引
data[0:2] 代表取得第0行和第1行,不包含最后一個。
注 意:只取一行的話,要用data[0:1],不能用data[0],data[0:2,]也會報錯
:2]col1 col2 col3 col4 col5row1 0 1 2 3 4row2 5 6 7 8 9

四、iloc按行號、列號索引
官方:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iloc.html
1、行索引
1)取一行 :data.iloc[0] 、data.iloc[0,:]
2)取多行 :data.iloc[[0,2]] 、data.iloc[[0,2],:]
3)取連續(xù)多行 :data.iloc[0:2] 、data.iloc[0:2,:]
2、列索引
4)取一列 :data.iloc[:,0]
5)取多列 :data.iloc[:,[0,2]]、data.iloc[:,[0,2]]
6)取連續(xù)多列 :data.iloc[:,0:2]
注 意:
取行的時候可以不提列,也可以用 ",:" 來指全列
取列的時候必須用":,"來指定全行。
可以使用一個數(shù)字來代表一個,可以使用一個列表[a,b]代表多個,也可以使用a:b代表連續(xù)多個。
data.iloc[0]col1 0col2 1col3 2col4 3col5 4

:,2:4]col3 col4row1 2 3row2 7 8row3 12 13row4 17 18row5 22 23

:,[2,4]]col3 col5row1 2 4row2 7 9row3 12 14row4 17 19row5 22 24

五、loc按行名、列名索引
官方網(wǎng)址:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.loc.html
1、行索引
取一行:data.loc['row1'] 、data.loc['row1',:]
取多行:data.loc[['row1','row2']] 、data.loc[['row1','row2'],:]
取連續(xù)多行:data.loc['row1':'row2'] 、data.loc['row1':'row2',:]
2、列索引
取一列:data.loc[:,'col1']
取多列:data.loc[:,['row1','row2']]
取連續(xù)多列:data.loc[:,'row1':'row2']
注 意:
取行的時候可以不提列,也可以用",:"來指全列。
取列的時候必須用":,"來指定全行。
可以使用一個數(shù)字來代表一個,可以使用一個list ['a','b']代表多個,也可以使用'a':'b'代表連續(xù)多個。
:,'col1':'col3']col1 col2 col3row1 0 1 2row2 5 6 7row3 10 11 12row4 15 16 17row5 20 21 22

:,['col1','col3']]col1 col3row1 0 2row2 5 7row3 10 12row4 15 17row5 20 22

#當(dāng)索引為整數(shù)時,可以用整數(shù)進(jìn)行索引data = pd.DataFrame(np.arange(25).reshape(5, 5),columns=['col1', 'col2','col3','col4', 'col5'])col1 col2 col3 col4 col50 0 1 2 3 41 5 6 7 8 92 10 11 12 13 143 15 16 17 18 194 20 21 22 23 24:3,'col1':'col3']col1 col2 col30 0 1 21 5 6 72 10 11 123 15 16 17

六、使用iat和at
iat 和 at 只能取單個元素,iat 使用行、列索引,at 使用行、列名,但是其功能被 iloc 和 loc 包含,因此不推薦。
data.iat[1,2]7

data.at['row4','col4']18

七、最后總結(jié)(重點(diǎn)?。。。。?/span>
正常情況下,推薦使用 iloc 和 loc。最核心的點(diǎn)記住,取行可以不提列,取列必須提行,可以用一個數(shù)字,一個list,或者一個區(qū)間來取行列。ix新版的已經(jīng)棄用了,所以可以不用太關(guān)注。
往期精彩回顧
