1. 程式人生 > 程式設計 >詳解pandas中利用DataFrame物件的.loc[]、.iloc[]方法抽取資料

詳解pandas中利用DataFrame物件的.loc[]、.iloc[]方法抽取資料

pandas的DataFrame物件,本質上是二維矩陣,跟常規二維矩陣的差別在於前者額外指定了每一行和每一列的名稱。這樣內部資料抽取既可以用“行列名稱(對應.loc[]方法)”,也可以用“矩陣下標(對應.iloc[]方法)”兩種方式進行。
下面具體說明:

(以下程式均在Jupyter notebook中進行,部分語句的print()函式省略)

首先生成一個DataFrame物件:

import pandas as pd
score = [[34,67,87],[68,98,58],[75,73,86],[94,59,81]]
name = ['小明','小紅','小李']
course = ['語文','數學','英語','政治']
mydata1 = pd.DataFrame(data=score,columns=name,index=course)#指定行名(index)和列名(columns)
print(mydata1)
mydata2 = pd.DataFrame(score)#不指定行列名,預設使用0,1,2……
print(mydata2)
#指定行列名
  小明 小紅 小李
語文 34 67 87
數學 68 98 58
英語 75 73 86
政治 94 59 81
#採用預設行列名
  0  1  2 (預設列名)
0 34 67 87
1 68 98 58
2 75 73 86
3 94 59 81

DataFrame物件生成時除了必須指定data引數外,使用者還可以指定兩個引數columns(列名)和index(行名,注意這裡的index不僅可以是數字,也可以是使用者指定的任何資料型別,如字母),如果不指定,則行列名預設都採用0、1、2……。

下圖說明了前面的情況:

詳解pandas中利用DataFrame物件的.loc[]、.iloc[]方法抽取資料

DataFrame物件的.loc[]和.iloc[]方法都可用於抽取資料,區別是:

  • .loc[]:是location,以columns(列名)和index(行名)作為引數。
  • .iloc[]:是index location,以二維矩陣的位置指標(即0,2……)作為引數。

.loc[]語法

.loc[行標籤名/[行標籤名list],列標籤名/[列標籤名list]],即有兩個輸入引數,第一個指定行名,第二個指定列名。當只有一個引數時,預設是行名(即抽取整行),所有列都選中。

.iloc[]語法

.loc[行位置/[行位置list],列位置/[列位置list]],也有兩個輸入引數,第一個指定行位置,第二個指定列位置。當只有一個引數時,預設是行位置(即抽取整行),所有列都選中。

例1.抽取1行資料

#以下用.loc[]抽取1行名為‘語文'的資料(包括所有列)
mydata1.loc['語文']
mydata1.loc['語文',]
mydata1.loc['語文',:]
mydata1.loc[['語文'],]
mydata1.loc[['語文'],:]
#以下用.iloc[]抽取1行名為‘語文'的資料(包括所有列)
mydata1.iloc[0]
mydata1.iloc[0,]
mydata1.iloc[0,:]
mydata1.iloc[[0],]
mydata1.iloc[[0],:]

#輸出方式1(第1個引數無[],這是一個Series物件):
小明  34
小紅  67
小李  87
Name: 語文,dtype: int64
#輸出方式2(第1個引數有[],這是一個DataFrame物件):
  小明 小紅 小李
語文 34 67 87
Name: 語文,dtype: int64

上述.loc[]和.iloc[]都只接收了1個引數“語文”或者“0”,因此預設都表示行資訊,而列則全部被選中,即抽取'語文'這整一行資料。','表示將兩個引數隔開(如果有兩個引數的話),':'這裡表示選擇中所有列。當只有一個輸入引數時,python預設','和':'既可寫上也可省略。注意:引數['語文']或[0]中只有一個物件時(即只有一行),[]也可以省略,如果有多個物件(即多行)則必須加上[]。此外還需注意,加上[]表示抽取的結果無論是一個數據,一行資料,還是一列資料,他都是DataFrame物件;不加[]時,如果選中的是一行或者一列資料,則是Series物件,如果是一個單獨的資料,則是該資料本身的型別。

例2.指定行名抽取任意多行資料

#指定多行行名抽取
mydata1.loc[['英語','語文','政治'],:]
  小明 小紅 小李
英語 75 73 86
語文 34 67 87
政治 94 59 81
mydata1.iloc[[1,0],:]
  小明 小紅 小李
數學 68 98 58
語文 34 67 87

例2和例1唯一的差別是,第一個引數指定了多行一起輸出,此時必須用[]將各行名或者下標括起來,否則出錯。後面的','和':'同例1,可省略。注意:原始資料的行順序是:語文、數學、英語、政治,這裡的提取順序是['英語','政治'],而輸出也是'英語','政治',可見輸出順序和引數指定順序是一致的,而非按原始順序輸出。

例3.抽取連續任意多行資料

mydata1.loc['語文':'英語',:] #連續抽取從語文到英語的所有行
  小明 小紅 小李
語文 34 67 87
數學 68 98 58
英語 75 73 86

mydata1.loc[:'英語',:] #連續抽取從第1行到英語的所有行
  小明 小紅 小李
語文 34 67 87
數學 68 98 58
英語 75 73 86

mydata1.iloc[0:3,:] #連續抽取1~3行
  小明 小紅 小李
語文 34 67 87
數學 68 98 58
英語 75 73 86

mydata1.iloc[1:,:] #連續抽取第2行最後一行
  小明 小紅 小李
數學 68 98 58
英語 75 73 86
政治 94 59 81

例3依然是接受1個引數,列引數沒有,後面的','和':'同例1,可省略。連續引數用‘start:end'的方式指定行範圍。注意:這裡不能用[]將其括起來,否則出錯。此外用行列名連續取值時,比如['語文':'政治']會把'政治'所在行也取出來,而利用矩陣下標時,0:3只取0,2對應的三行,最後一行不會取出;但是如果行列標籤名本身就是整數0,2……,而不是文字或者其他型別,那麼在使用連續行列標籤名取資料時,最後一行或者列是不會被取出的。

例4.抽取“列”的各種情況

mydata1.loc[:,['小紅']] #所有行,小紅列,只有一列時,內部[]也可以省略
  小紅
語文 67
數學 98
英語 73
政治 59

mydata1.loc[:,['小明','小紅']] #所有行,小明和小紅兩列
  小明 小紅
語文 34 67
數學 68 98
英語 75 73
政治 94 59

mydata1.iloc[:,[1,2]] #所有行,第2和第3列
  小紅 小李
語文 67 87
數學 98 58
英語 73 86
政治 59 81

mydata1.loc[:,'小明':] #連續抽取從小明列開始到最後一列
  小明 小紅 小李
語文 34 67 87
數學 68 98 58
英語 75 73 86
政治 94 59 81

mydata1.iloc[:,:3] #連續抽取從1列開始到第3列
  小明 小紅 小李
語文 34 67 87
數學 68 98 58
英語 75 73 86
政治 94 59 81

抽取整列的方式跟抽取整行在引數設定上完全一樣。.loc[]和.iloc[]兩個方法預設列為第二個引數,因此抽取整列時,都必須帶上':,'作為區分前面行引數的‘分隔符',否則出錯。

例5.同時抽取指定行和列對應資料

mydata1.loc['語文','小明'] #輸入了兩個引數,輸出語文行小明列,即一個數據
34
<class 'numpy.int64'> #沒帶[]時,單個數字是這種型別
mydata1.loc[['語文'],['小明']] #輸出語文行小明列,即一個數據
  小明
語文 34
<class 'pandas.core.frame.DataFrame'> #帶[]時,輸出依然是DataFrame物件

mydata1.iloc[1,2] #第2行第3列資料,單個數據
58
<class 'numpy.int64'> #注意沒帶[]時的輸出型別
mydata1.iloc[[1],[2]]
  小李
數學 58
<class 'pandas.core.frame.DataFrame'> #注意帶[]時的輸出型別

mydata1.loc[['語文','數學'],['小明']] #輸出語文數學行,小明列的資料
  小明
語文 34
數學 68

mydata1.iloc[1:,[0,2]] #輸出從第2行到最後一行,第1和第3行對應資料
  小明 小李
數學 68 58
英語 75 86
政治 94 81

同時抽取分部行和列的情況,就是把上述單獨抽取行和列的方式合併起來用。抽取整個DataFrame物件則是.loc[:,:]或.iloc[:,:],雖然這麼做沒啥意義。

總結:

(1)DataFrame物件的.loc[,]和.iloc[,]方法用於抽取資料,.loc[,]用行列的標籤名作為引數,.iloc[,]用二維矩陣元素的網格下標作為引數。
(2)兩個方法都接受兩個引數,第一個是“行標籤”或者“矩陣行號”,第二個是“列標籤”或者“矩陣列號”。
(3)兩種方法當只指定一個輸入引數時,都默是跟“行”相關,而“列”則全部被選中。如何行和列都需要指定時,中間用“逗號,”隔開,這非常重要,否則出錯。
(4)當需要選中所有行的某幾列時,行引數可以省略,列引數需要指定,此時列引數前面必須帶上“,:”,形如.loc[:,列引數],.iloc[:,列引數]。
(5).loc[,]設定了一個還是兩個輸入引數,關鍵看有沒有“,”將兩個引數分開,且要區分逗號是一個引數的內部逗號,還有用於分隔行列引數的逗號。
(6)對於兩個引數的概念區分,.loc['語文','數學']這表示輸入了兩個引數,行引數是‘語文',列引數是‘數學',對於上面的表格而言這是錯的,因為沒有叫‘數學'的列,應寫為[['語文','數學']],即‘數學'也是行引數的一部分,['語文','數學']整體作為一個行引數,這裡的逗號不是用以分隔行和列,僅僅是行list裡面的逗號。[['語文','數學']]=[['語文',]=[['語文',:],都表示只有一個行引數,列全部選中。

到此這篇關於詳解pandas中利用DataFrame物件的.loc[]、.iloc[]方法抽取資料的文章就介紹到這了,更多相關pandas .loc[]、.iloc[]抽取資料內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!