pandas loc 和 iloc
在Python的Pandas库中,iloc和loc是两种非常常用的索引器,它们都用于选择DataFrame中的数据。不过,它们在选择数据时的侧重点和行为有所不同。
iloc
iloc是基于行和列的整数位置进行数据选择的。它直接通过行和列的索引位置来选择数据,而不关心数据的实际值。这意味着,如果你使用iloc,你实际上是在选择行和列的物理位置。
实际案例:
假设我们有一个DataFrame df,如下所示:
import pandas as pd
data = {'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]}
df = pd.DataFrame(data)
使用iloc选择第一行和第二列的数据:
print(df.iloc[0, 1]) # 输出第二列的值,即5
loc
与iloc不同,loc是基于行和列的标签(即索引标签或列名)进行数据选择的。这意味着,当你使用loc时,你选择的是行和列的标签对应的数据。
实际案例:
使用相同的DataFrame df,使用loc选择第一行和列’B’的数据:
print(df.loc[0, 'B']) # 输出列'B'第一行的值,即4
区别
iloc严格依赖于行和列的整数索引,它不会受DataFrame的索引或列名的改变影响。loc依赖于行索引和列名,如果DataFrame的索引或列名发生变化,使用loc选择的数据也会相应变化。
使用切片
当使用切片时,这两种索引器的行为也有所不同:
iloc使用切片
使用iloc进行切片时,选择的是整数位置的连续序列,切片包左不包右。例如:
print(df.iloc[0:2]) # 选择第2行到第3行的所有列
输出结果
A B C
0 1 4 7
1 2 5 8
loc使用切片
- 使用
loc进行切片时,选择的是标签的连续序列,切片包左且包右。例如:
print(df.loc[0:2]) # 选择索引1到3的所有列
输出结果
A B C
0 1 4 7
1 2 5 8
2 3 6 9
总结来说,iloc和loc在使用切片时,前者基于整数位置,后者基于标签。选择哪种取决于你希望基于什么标准来选择数据。
高级用法
1. 布尔索引
布尔索引是一个非常有用的功能,可以用于loc来过滤数据。通过布尔数组来选择数据,仅返回数组中True对应的行。
实例:
import pandas as pd
data = {'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]}
df = pd.DataFrame(data)
# 使用布尔索引选择B列值大于4的行
print(df.loc[df['B'] > 4])
输出结果:
A B C
1 2 5 8
2 3 6 9
2. 同时使用loc和iloc来修改数据
你可以使用loc或iloc修改DataFrame中的数据。这对于数据清洗和准备是非常有用的。
实例:
# 使用loc修改
df.loc[0, 'A'] = 10
# 使用iloc修改
df.iloc[1, 2] = 20
print(df)
输出结果:
A B C
0 10 4 7
1 2 5 20
2 3 6 9
常见问题及解决方案
问题1:索引越界错误
当你使用iloc访问一个不存在的位置时,会引发IndexError。
解决方案:
检查DataFrame的形状,确保你的索引在允许的范围内。可以使用df.shape来查看行数和列数。
问题2:KeyError使用loc
当使用loc时,如果引用的列名或行索引不存在,则会引发KeyError。
解决方案:
确保你使用的列名和行索引存在于DataFrame中。可以通过df.columns和df.index查看现有的列名和行索引。
问题3:切片与单个标签混淆
当使用切片语法但实际上意图是单个标签选择时,可能导致意外的结果。
解决方案:
使用切片时确保使用正确的语法。对于loc,如果需要选择单行或单列,使用['label']或[start:end]来明确表示。
更多问题咨询
更多推荐



所有评论(0)