[Pandas] 按轴标签.loc VS 按数字索引.iloc

本文详细介绍了Pandas中.loc和.iloc的区别与用法,包括基于标签和位置的索引、切片操作以及条件查询。.loc主要用于基于标签的索引,支持左闭右闭的切片,而.iloc则是基于位置的索引,切片为左闭右开。文章通过多个实例展示了如何选取特定行、列,以及如何进行条件筛选。.loc和.iloc在处理DataFrame时提供了灵活的数据访问方式。
摘要由CSDN通过智能技术生成
美图欣赏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按条件查询数据案例

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值