50個Pandas的奇淫技巧:一網打盡各種索引 iloc,loc,ix,iat,at…

cda數據分析師 發佈 2022-05-23T05:13:51.010057+00:00

作者:小伍哥來源: 小伍哥聊風控數據處理,也是風控非常重要的一個環節,甚至說是模型成敗的關鍵環節。因此,嫻熟簡潔的數據處理技巧,是提高建模效率和建模質量的必要能力。這裡開個專題,總結下Pandas的使用方法,方便大家,也方便自己查閱。

作者:小伍哥

來源: 小伍哥聊風控

數據處理,也是風控非常重要的一個環節,甚至說是模型成敗的關鍵環節。因此,嫻熟簡潔的數據處理技巧,是提高建模效率和建模質量的必要能力。這裡開個專題,總結下pandas的使用方法,方便大家,也方便自己查閱。

這個專題叫做:【50個Pandas的奇淫技巧】,今天這個算是第一講,後續慢慢更新。

一、Pandas索引概述

很多人在使用Pandas處理數據時,總會迷失在data[]、iloc()、loc()、ix()中,似乎記得,又似乎不記得,每到用時都需要百度,不知所以然的解決了問題,下次繼續百度,記憶點基本上非常混亂。總結本文,希望能解決這個問題,通過一個簡單的案例徹底搞明白這幾種索引方法到底有什麼區別。

日常使用中,推薦使用loc和iloc進行索引,loc是指location的意思,iloc中的 i 是指integer,這兩個方法容易混淆,可以使用特殊方式來加強記憶。

iloc:基於位置,用行號、列號進行索引,i 可以看著 int,因此 iloc 只能用整數 來索引,例如data.iloc[0:2,:]

loc :基於標籤,用行名、列名進行索引,數據的index經常為整數,因此 loc 的使用範圍要遠高於iloc,loc可以使用整數切片、名稱(index,columns)索引、也可以切片和名稱混合使用。例如:data.loc[0:5:,'row1':'row2']

我們簡單構造一個數據集,在下面的案例中需要用到。

import pandas as pd
import numpy  as np
data = pd.DataFrame(np.arange(25).reshape(5, 5), 
                  index = ['row1', 'row2','row3','row4','row5'], 
                  columns=['col1', 'col2','col3','col4','col5'])
data 
      col1  col2  col3  col4  col5
row1     0     1     2     3     4
row2     5     6     7     8     9
row3    10    11    12    13    14
row4    15    16    17    18    19
row5    20    21    22    23    24

創建的表格數據如下:


二、直接用列名索引

取一列:data['col1'] ,即取得第一列,得到的是一個Series對象。

取多列:data[['col1','col2']] ,即取得第一列、第二列,得到的是一個DataFrame對象。

注 意:用data['row1'] 、data[0]、data[:,0]、data[0,:]、data[:,'col1':'col2'] 統統都會報錯的,這類命令只能用來按列名取一列或多列

data['col1']
row1     0
row2     5
row3    10
row4    15
row5    20
data[['col1','col2']] 
      col1  col2
row1     0     1
row2     5     6
row3    10    11
row4    15    16
row5    20    21


#下面的命令直接應用都會報錯,但是用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,]也會報錯

data[0:2]
      col1  col2  col3  col4  col5
row1     0     1     2     3     4
row2     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)取連續多行 :data.iloc[0:2] 、data.iloc[0:2,:]

2、列索引

4)取一列 :data.iloc[:,0]

5)取多列 :data.iloc[:,[0,2]]、data.iloc[:,[0,2]]

6)取連續多列 :data.iloc[:,0:2]

注 意:

取行的時候可以不提列,也可以用 ",:" 來指全列

取列的時候必須用":,"來指定全行。

可以使用一個數字來代表一個,可以使用一個列表[a,b]代表多個,也可以使用a:b代表連續多個。

data.iloc[0]
col1    0
col2    1
col3    2
col4    3
col5    4
data.iloc[:,2:4]
      col3  col4
row1     2     3
row2     7     8
row3    12    13
row4    17    18
row5    22    23
data.iloc[:,[2,4]]
      col3  col5
row1     2     4
row2     7     9
row3    12    14
row4    17    19
row5    22    24


五、loc按行名、列名索引

官方網址: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'],:]

取連續多行:data.loc['row1':'row2'] 、data.loc['row1':'row2',:]

2、列索引

取一列:data.loc[:,'col1']

取多列:data.loc[:,['row1','row2']]

取連續多列:data.loc[:,'row1':'row2']

注 意:

取行的時候可以不提列,也可以用",:"來指全列。

取列的時候必須用":,"來指定全行。

可以使用一個數字來代表一個,可以使用一個list ['a','b']代表多個,也可以使用'a':'b'代表連續多個。

data.loc[:,'col1':'col3'] 
      col1  col2  col3
row1     0     1     2
row2     5     6     7
row3    10    11    12
row4    15    16    17
row5    20    21    22
data.loc[:,['col1','col3']]
      col1  col3
row1     0     2
row2     5     7
row3    10    12
row4    15    17
row5    20    22
#當索引為整數時,可以用整數進行索引
data = pd.DataFrame(np.arange(25).reshape(5, 5), 
                  columns=['col1', 'col2','col3','col4', 'col5'])
   col1  col2  col3  col4  col5
0     0     1     2     3     4
1     5     6     7     8     9
2    10    11    12    13    14
3    15    16    17    18    19
4    20    21    22    23    24


data.loc[0:3,'col1':'col3'] 
   col1  col2  col3
0     0     1     2
1     5     6     7
2    10    11    12
3    15    16    17


六、使用iat和at

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

data.iat[1,2] 
7
data.at['row4','col4'] 
18


七、最後總結(重點!!!!)

正常情況下,推薦使用 iloc 和 loc。最核心的點記住,取行可以不提列,取列必須提行,可以用一個數字,一個list,或者一個區間來取行列。ix新版的已經棄用了,所以可以不用太關注。

關鍵字: