0Pricing
Pandas & NumPy Academy · 课时

基于标签与基于位置的访问

使用 .loc(标签)和 .iloc(整数位置)获取元素,并理解两者的区别。

基于标签与基于位置的访问 是 CoddyKit 上的免费 Pandas & NumPy Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Pandas & NumPy Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Pandas & NumPy Academy 课程共包含 4 节课。

访问 Series 元素的两种方式

Pandas 提供了两种主要的访问器,用于从 Series 中选择元素:.loc 用于基于标签的访问,.iloc 用于基于整数位置的访问。了解何时该使用哪一种非常重要——在整数索引的 Series 上使用错误的访问器会产生令人困惑的结果,而且 Pandas 2.0 已弃用许多含义不明确的直接方括号用法。

import pandas as pd

s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
print(s.loc['b'])    # 20  -- by label
print(s.iloc[1])     # 20  -- by position

.loc:基于标签的访问

.loc 根据元素的索引标签访问元素。您可以传入单个标签(返回标量)、标签列表(返回 Series)或标签切片(两端都包含,这与 Python 切片不同)。如果标签不存在,Pandas 会引发 KeyError。当标签具有实际意义(例如日期、名称、ID)时,请使用 .loc。

import pandas as pd

s = pd.Series([10, 20, 30, 40, 50],
              index=['a', 'b', 'c', 'd', 'e'])

print(s.loc['c'])          # 30
print(s.loc[['a', 'c']])   # a:10 c:30
print(s.loc['b':'d'])      # b:20 c:30 d:40 -- inclusive

.iloc:基于位置的访问

.iloc 根据元素的整数位置(从 0 开始)访问元素,完全忽略索引标签。它的行为类似于 Python 列表索引:负位置从末尾开始计数,切片遵循 Python 的结束位置不包含规则。当您需要获取第 n 个元素而不考虑其标签时,请使用 .iloc。

import pandas as pd

s = pd.Series([10, 20, 30, 40, 50],
              index=['a', 'b', 'c', 'd', 'e'])

print(s.iloc[2])          # 30  -- third element
print(s.iloc[-1])         # 50  -- last element
print(s.iloc[1:4])        # b:20 c:30 d:40 -- exclusive stop

.loc 和 .iloc 的区别

对于使用整数作为标签的 Series,这一区别最为重要。如果 Series 的索引标签为 [5, 10, 15],那么 s.loc[5] 会返回标签为 5 的元素(第一个元素),而 s.iloc[5] 会引发 IndexError(因为其中只有 3 个元素)。请始终根据您的意图进行选择:您要的是“标签为 X 的元素”,还是“第 X 个元素”。

import pandas as pd

s = pd.Series([100, 200, 300], index=[5, 10, 15])
print(s.loc[10])   # 200  -- element with label 10
print(s.iloc[1])   # 200  -- second element
# s.loc[1] would raise KeyError -- no label 1

使用 .loc 选择多个标签

向 .loc 传入列表,可以按任意顺序选择多个元素,也可以包含重复项。结果是一个新的 Series,其标签与您提供的列表相同。这类似于 NumPy 中的花式索引,但它依据的是索引标签而不是位置。它常用于在分析管道中重新排列列或选取列的子集。

import pandas as pd

s = pd.Series({'Jan': 100, 'Feb': 200, 'Mar': 300, 'Apr': 400})

# Select Q1 months in reverse order
print(s.loc[['Mar', 'Feb', 'Jan']])
# Mar    300
# Feb    200
# Jan    100

使用 .loc 按标签切片

与 Python 切片不同,.loc 切片包含两端。s.loc['b':'d'] 会返回标签为 b、c 和 d 的元素。如果您习惯了 Python 不包含结束位置的规则,这种行为可能会令人意外。请确保切片范围两端的标签确实存在于索引中,否则切片可能会在不提示的情况下返回出乎意料的结果。

import pandas as pd

s = pd.Series(range(5), index=['a', 'b', 'c', 'd', 'e'])
print(s.loc['b':'d'])
# b    1
# c    2
# d    3
# dtype: int64
# Note: 'd' is INCLUDED (inclusive stop)

使用 .loc 进行布尔索引

您可以向 .loc 传入布尔 Series 来筛选元素。该布尔 Series 必须与目标 Series 具有相同的索引。这相当于 Pandas 中的 NumPy 布尔掩码,并支持使用 & 和 | 组合条件。这也是筛选 DataFrames 中行的标准方式。

import pandas as pd

s = pd.Series([3, 7, 2, 9, 1], index=['a', 'b', 'c', 'd', 'e'])
print(s.loc[s > 4])
# b    7
# d    9
# dtype: int64

使用 .loc 和 .iloc 设置值

.loc 和 .iloc 都可以出现在赋值语句的左侧,用于原地修改值。这是正确的写法——使用 s['a'] = 99 这样的链式索引,可能会在 DataFrames 中触发 SettingWithCopyWarning。对于 Series,直接按标签访问通常是安全的,但使用 .loc 更明确,也更推荐。

import pandas as pd

s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
s.loc['b'] = 99
print(s)
# a    10
# b    99
# c    30

Series 上的方括号访问

直接使用方括号表示法 s['label'] 可以按标签访问;对于字符串索引,它等价于 s.loc['label']。对于整数索引,这种行为存在歧义,并且在 Pandas 2.0 中已发生改变——现在它始终表示按标签访问。为了让代码更清晰并适应未来版本,请始终明确使用 .loc 或 .iloc,不要依赖方括号的歧义消除机制。

import pandas as pd

s = pd.Series([10, 20, 30], index=['x', 'y', 'z'])
print(s['y'])      # 20  -- label access via brackets
print(s.loc['y']) # 20  -- explicit and preferred

从 DatetimeIndex 访问元素

当 Series 具有 DatetimeIndex 时,.loc 接受不完整的日期字符串,方便按范围选择。s.loc['2023'] 会返回 2023 年的所有元素,s.loc['2023-01':'2023-06'] 会返回 2023 年上半年的元素。这是 Pandas 在时间序列处理方面最便捷的功能之一。

import pandas as pd

dates = pd.date_range('2023-01-01', periods=5, freq='ME')
values = pd.Series([10, 20, 30, 40, 50], index=dates)
print(values.loc['2023-03':'2023-05'])
# 2023-03-31    30
# 2023-04-30    40
# 2023-05-31    50

使用 at 和 iat 加速单元素访问

.at[label] 和 .iat[position] 是经过优化的标量访问器——在紧密循环中访问单个元素时,它们比 .loc 和 .iloc 更快,因为它们省去了返回 Series 对象的开销。它们不能选择多个元素。当您需要在重复的单元素查找中获得最高性能时,请使用它们。

import pandas as pd

s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
print(s.at['b'])    # 20  -- label scalar access
print(s.iat[2])     # 30  -- position scalar access

快速检查

请测试您对本课中 .loc 和 .iloc 的理解。

课程回顾

本课中您学习了:.loc 按索引标签访问元素,切片结束位置包含在内;.iloc 按整数位置访问元素,切片结束位置不包含在内,与 Python 列表一致;以及.at 和 .iat 是在循环中查找单个元素时更快的标量访问器。接下来,我们将学习 Series 上的向量化操作,以及 Pandas 如何自动处理索引对齐。

常见问题解答

「基于标签与基于位置的访问」课时是免费的吗?

是的 — 「基于标签与基于位置的访问」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Pandas & NumPy Academy 课程的其余内容,请升级到 CoddyKit PRO。 Pandas & NumPy Academy 课程共包含 4 节课。

「基于标签与基于位置的访问」这节课中我会学到什么?

使用 .loc(标签)和 .iloc(整数位置)获取元素,并理解两者的区别。 你通过在浏览器中直接运行的动手代码来练习 Pandas & NumPy Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Pandas & NumPy Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Pandas & NumPy Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「基于标签与基于位置的访问」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Pandas & NumPy Academy 课中编写并运行代码吗?

能。每节 Pandas & NumPy Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 创建 Series
  2. 基于标签与基于位置的访问
  3. Series 上的向量化运算
  4. 实用的 Series 方法
← 返回 Pandas & NumPy Academy