程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

[Pandas] 按軸標簽.loc VS 按數字索引.iloc

編輯:Python
美圖欣賞2022/06/24

iloc和loc的區別

1.loc是基於索引值的,切片是左閉右閉的

2.iloc是基於位置的,切片是左閉右開的

1.按軸標簽.loc

.loc的格式是df.loc[<行表達式>,<列表達式>],如果<列表達式>不傳,將返回所有列

Series僅支持<行表達式>進行索引的部分

.loc操作通過索引和列的條件篩選出數據,如果僅返回一條數據,則該數據類型為Series

以下示例為單個索引

import pandas as pd
df = pd.DataFrame([['liver','E',89,21,24,64],
['Arry','C',36,37,37,57],
['Ack','A',57,60,18,84],
['Eorge','C',93,96,71,78],
['Oah','D',65,49,61,86]
],
columns = ['name','team','Q1','Q2','Q3','Q4'])
# 選擇索引為0的行
res1 = df.loc[0]
# 選擇索引為4的行
res2 = df.loc[4]
# 如果索引是字符,需要加引號
# 索引為name
# 選擇索引name為Ack的行
res3 = df.set_index('name').loc['Ack']

df 

res1

res2

res3 

以下示例為列表組成的索引

import pandas as pd
df = pd.DataFrame([['liver','E',89,21,24,64],
['Arry','C',36,37,37,57],
['Ack','A',57,60,18,84],
['Eorge','C',93,96,71,78],
['Oah','D',65,49,61,86]
],
columns = ['name','team','Q1','Q2','Q3','Q4'])
# 指定索引為0,2,4的行
res1 = df.loc[[0,2,4]]
# 索引設置為name,兩位學生
res2 = df.set_index('name').loc[['Arry','Ack']]

df

res1

res2 

以下示例為帶標簽的切片(包括起始和停止)

import pandas as pd
df = pd.DataFrame([['liver','E',89,21,24,64],
['Arry','C',36,37,37,57],
['Ack','A',57,60,18,84],
['Eorge','C',93,96,71,78],
['Oah','D',65,49,61,86]
],
columns = ['name','team','Q1','Q2','Q3','Q4'])
# 索引切片,代表0~3行,包括3
res1 = df.loc[0:3]
res2 = df.loc[:]

df

res1

res2

附帶列篩選,必須有行篩選

# 前3行,name和Q2兩列
res3 = df.loc[0:2,['name','Q2']]
# 所有列,Q1和Q2兩列
res4 = df.loc[:,['Q1','Q2']]
# 0~2行,Q1後邊所有列
res5 = df.loc[:2,'Q1':]
# 所有內容
res6 = df.loc[:,:]

res3

res4

res5

res6 

提示

.loc中的表達式支持條件表達式,可以按條件查詢數據 

import pandas as pd
df = pd.DataFrame([['liver','E',89,21,24,64],
['Arry','C',36,37,37,57],
['Ack','A',57,60,18,84],
['Eorge','C',93,96,71,78],
['Oah','D',65,49,61,86]
],
columns = ['name','team','Q1','Q2','Q3','Q4'])
# 判斷數值部分的所有值是否大於60
res1 = df.loc[:,'Q1':'Q4'] > 60
# Q1大於90,顯示Q1及其後所有列
res2 = df.loc[df['Q1'] > 90,'Q1':]
# and關系
res3 = df.loc[(df.Q1 > 50) & (df.Q2 < 65)]
# or關系
res4 = df.loc[(df.Q1 > 90) | (df.Q3 < 30)]
# Q1等於36
# res5 = df.loc[df.Q1 == 36]
res5 = df.loc[df['Q1'] == 36]
# Q1大於90,只顯示Q1
res6 = df.loc[df['Q1'] > 90,'Q1']

df

res1 

res2 

res3 

res4

res5 

res6 

需要注意在進行或(|)、與(&)、非(~)運算時,各個獨立邏輯表達式需要用括號括起來 

# Q1、Q2成績都超過50分的行記錄
res7 = df[(df.loc[:,['Q1','Q2']] > 50).all(1)]
# Q1、Q2成績至少有一個超過50分的行記錄
res8 = df[(df.loc[:,['Q1','Q2']] > 50).any(1)]

res7

res8 

上述兩例對兩個列整體先做邏輯計算得到一個兩列的布爾序列,然後用all和any在行方向上做邏輯運算

all和any可以傳入axis參數值用於指定判斷方向,默認0為列方向,1為行方向

2.按數字索引.iloc

.iloc的格式是df.iloc[<行表達式>,<列表達式>]

與loc[]可以使用索引和列的名稱不同,iloc[]使用數字索引(行和列的0~n索引)進行數據篩選,意味著iloc[]兩個表達式只支持數字切片形式,其他方面和loc[]是相同的

import pandas as pd
df = pd.DataFrame([['liver','E',89,21,24,64],
['Arry','C',36,37,37,57],
['Ack','A',57,60,18,84],
['Eorge','C',93,96,71,78],
['Oah','D',65,49,61,86]
],
columns = ['name','team','Q1','Q2','Q3','Q4'])
# 前三行(左閉右開)
res1 = df.iloc[:3]
# 所有數據
res2 = df.iloc[:]
# 步長為2
res3 = df.iloc[0::2]
# 返回0~2行,前兩列
res4 = df.iloc[:3,[0,1]]
# 返回0~2行,所有列
res5 = df.iloc[:3,:]
# 返回0~2行,從右往左第三列以左的所有列
res6 = df.iloc[:3,:-2]
# 獲取name字段前3個值
res7 = df['name'].iloc[:3]

df

res1 

res2 

res3

res4

res5

res6

res7

提示

.iloc中的表達式支持條件表達式,可以按條件查詢數據,用法和.loc是相似的,可參考上述.loc按條件查詢數據案例


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved