在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]来明确表示。

更多问题咨询

Cos机器人

更多推荐