iloc和loc的区别
1.loc是基于索引值的,切片是左闭右闭的
2.iloc是基于位置的,切片是左闭右开的
.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为行方向
.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按条件查询数据案例