# 4.2.1 使用选择器和快速访问器

数据框（DataFrame）的数据选择分为按列访问、按行访问和切片。按列访问有两种语法：`对象名['列标签']` 把列标签当字符串处理，必须加引号，可处理任意字符的列标签；`对象名.列标签` 通过数据框的属性访问列，不加引号，但对列标签要求较严——不能有空格、特殊字符，且不能与已有方法或属性重名。例如 `df['平安科技']`、`df.南方通信` 都得到一列序列。访问一列后再取其中一个元素，按访问序列的方法：`对象名['列标签']['行标签']`，注意列标签在前、行标签在后，如 `df["平安科技"]['2024-02']` 得到 47.1。数据框按列访问不支持切片，但支持用列标签列表选取多列，语法为 `对象名[['列标签',…]]`，如 `df[['平安科技', '幸福银行']]`。

按行访问必须使用选择器 `loc` 和 `iloc`（见表4-1）：`loc` 通过标签访问，`iloc` 通过整数索引访问。例如 `df.loc['2024-01']` 取出该月整行，`df.iloc[1]` 取出第 2 行（对应 2024-02）。访问一行后再取其中一个元素：`对象名.loc['行标签']['列标签']`（行标签在前、列标签在后），如 `df.loc['2024-01']['平安科技']` 得到 45.2；整数位置则用 `对象名.iloc[行索引, 列索引]`，如 `df.iloc[1, 2]` 得到 4.6。

切片时，`df.loc['2024-01':'2024-02']` 按行标签切片且包含结束标签；`df.iloc[0:2]` 按整数位置切片，不含结束位置。行、列可同时切片：`df.iloc[0:2,0:2]` 切前 2 行和前 2 列交叉处的数据块；仅按列切片用 `df.iloc[:,0:2]`。快速访问器 `at[]` 和 `iat[]` 只取单个元素，功能与 `loc`、`iloc` 类似，但性能更优、速度更快：`df.at['2024-02','平安科技']` 用行、列标签（行在前），结果 47.1；`df.iat[0, 2]` 用整数位置（行在前），结果 3.4。易错点：链式取元素时，按列是先列后行，按行（`loc`/`iloc`）和 `at`/`iat` 都是先行后列；`loc` 切片含结束标签，`iloc` 不含；`at`/`iat` 只能取单个元素，不能切片。

## 关键要点
- 按列：`df['列标签']` 可处理任意列名；`df.列标签` 要求列名合法且不与属性/方法重名。
- 取一列中的一个元素：`df['列标签']['行标签']`（列在前、行在后）。
- 按列不支持切片，多列用标签列表：`df[['列1','列2']]`。
- 按行用选择器：`loc` 按标签，`iloc` 按整数索引。
- 取一行中的一个元素：`df.loc['行标签']['列标签']`（行在前、列在后）。
- `loc` 行切片包含结束标签；`iloc` 切片不含结束位置。行、列可同时切，如 `df.iloc[0:2,0:2]`、`df.iloc[:,0:2]`。
- 快速访问器：`at[行标签,列标签]`、`iat[行位置,列位置]` 只取单个元素，速度更快。

---
