Pandas :索引机制与数据访问

Pandas 的运行逻辑建立在索引对象之上。索引对象不仅用于显示标签,更承担"标签查找"的职责。所有基于标签的访问与运算,都会先经过索引对象完成查找与匹配,再进入数据区域。

示例数据:

bash 复制代码
import pandas as pd
df = pd.DataFrame({    "姓名": ["张三", "李四", "王五"],    "城市": ["北京", "上海", "北京"],    "收入": [8000, 12000, 10000],        "年龄": [25, 30, 28]})
# 显式设置行索引df.index = ["A001", "A002", "A003"]print(df)

输出:

go 复制代码
姓名  城市     收入  年龄A001  张三  北京   8000  25A002  李四  上海  12000  30A003  王五  北京  10000  28

此时 DataFrame 中的数据访问存在四种定位途径:

(1)行标签(A001、A002、A003)

(2)行位置(0、1、2)

(3)列标签("姓名"、"城市"、"收入"、"年龄")

(4)列位置(0、1、2、3)

这四种定位途径共同构成二维结构的定位体系。

需要区分的是:

• 标签(labels)由 Index 对象管理

• 位置(position)由数据区域的物理排列决定

在 Pandas 中,.loc 负责基于标签的访问,.iloc 主要负责基于位置的访问。

一、.loc:基于标签访问

.loc[] 根据参数结构,既可返回单行(Series),单列(Series),单元格值(标量)或子 DataFrame。

基本语法:

css 复制代码
df.loc[row_selector, col_selector]

• row_selector:行标签选择器

• col_selector:列标签选择器(可省略,默认选择全部列)

1、访问单行

按行标签访问,返回一个 Series(行切片结果)。

语法:

css 复制代码
df.loc[行标签]

示例:

bash 复制代码
df.loc["A002"]  # 行标签

返回:

cs 复制代码
姓名    李四城市    上海年龄    30Name: A002, dtype: object

注意:该 Series 是按列组织的一行结果,并不是 DataFrame 内部按列组织的"列 Series"。

2、访问单列

指定列标签,可返回 Series 或单列 DataFrame。

(1)返回 Series

语法:

css 复制代码
df.loc[:, 列标签]

列访问的简写形式:

bash 复制代码
df[列标签]

示例:

css 复制代码
df.loc[:, "姓名"]          df["姓名"]

返回:

cs 复制代码
A001    张三A002    李四A003    王五Name: 姓名, dtype: object

(2)返回单列 DataFrame

语法:

apache 复制代码
df.loc[:, [列标签]]

示例:

css 复制代码
df.loc[:, ["姓名"]]

返回:

go 复制代码
姓名A001  张三A002  李四A003  王五

3、访问单个元素

若同时指定行标签与列标签,可返回单元格值(标量)。

语法:

css 复制代码
df.loc[行标签, 列标签]

示例:

css 复制代码
df.loc["A002", "城市"]

返回:

go 复制代码
上海

建议使用 .at[] 进行快速地单个元素按标签访问:

css 复制代码
df.at["A002", "城市"]

4、访问数据区域------标签切片

DataFrame 的切片表达式与列表的切片表达式基本类似。

.loc 支持基于标签的切片,返回子 DataFrame。

(1)行切片

语法:

css 复制代码
df.loc[起始行标签:结束行标签]

或者:

css 复制代码
df.loc[起始行标签:结束行标签, :]

示例:

css 复制代码
df.loc["A001":"A002"]

返回:

go 复制代码
姓名  城市     收入  年龄A001  张三  北京   8000  25A002  李四  上海  12000  30

说明:

• .loc 标签切片为左闭右闭。

• 切片依据索引标签的顺序,而不是自动排序

• 若索引无序,切片结果可能不符合区间直觉

(2)行列同时切片

语法:

css 复制代码
df.loc[起始行标签:结束行标签, 起始列标签:结束列标签]

示例:

css 复制代码
df.loc["A002":"A003", "姓名":"收入"]

返回:

go 复制代码
姓名  城市     收入A002  李四  上海  12000A003  王五  北京  10000

二、.iloc:基于整数位置访问

.iloc[] 使用整数位置对数据进行访问。这里的"整数位置"指的是数据的物理排列顺序。

基本语法:

css 复制代码
df.iloc[row_position, col_position]

• row_position:行位置选择器(从 0 开始)

• col_position:列位置选择器(从 0 开始),可省略,默认选择全部列

1、访问单行

按行位置访问,返回一个 Series(行切片结果)。

语法:

css 复制代码
df.iloc[行位置]

示例:

apache 复制代码
df.iloc[0]   # 第 0 行

返回:

cs 复制代码
姓名      张三城市      北京收入    8000年龄      25Name: A001, dtype: object

2、访问单列

指定列位置,可返回 Series 或单列 DataFrame。

(1)返回 Series

语法:

css 复制代码
df.iloc[:, 列位置]

示例:

apache 复制代码
df.iloc[:, 0]   # 第 0 列

返回:

cs 复制代码
A001    张三A002    李四A003    王五Name: 姓名, dtype: object

(2)返回单列 DataFrame

语法:

apache 复制代码
df.iloc[:, [列位置]]

示例:

apache 复制代码
df.iloc[:, [1]]

返回:

go 复制代码
城市A001  北京A002  上海A003  北京

3、访问单个元素

若同时指定单个行位置与列位置,可返回单元格值(标量)。

语法:

css 复制代码
df.iloc[行位置, 列位置]

示例:

apache 复制代码
df.iloc[1, 1]   # 第 1 行第 1 列

返回:

go 复制代码
上海

建议使用 .iat[] 进行快速地单个元素按位置访问:

apache 复制代码
df.iat[1, 1]

4、访问数据区域------位置切片

.iloc 支持基于整数位置的切片,返回子 DataFrame。

(1)行切片

语法:

css 复制代码
df.iloc[起始位置:结束位置]

示例:

apache 复制代码
df.iloc[0:2]

返回:

go 复制代码
姓名  城市     收入  年龄A001  张三  北京   8000  25A002  李四  上海  12000  30

说明:

• .iloc 位置切片为左闭右开(包含起始位置,不包含结束位置)

• 不依赖索引排序状态

(2)行列同时切片

语法:

css 复制代码
df.iloc[起始行位置:结束行位置, 起始列位置:结束列位置]

示例:

apache 复制代码
df.iloc[0:2, 0:2]

返回:

go 复制代码
姓名   城市A001   张三   北京A002   李四   上海

三、按条件访问

按条件访问是通过布尔数组对数据进行筛选的机制。

其本质是先生成布尔序列,然后根据 True / False 选择数据区域。

当布尔对象为 Series 时,Pandas 会进行索引对齐(index alignment),按标签匹配:

go 复制代码
布尔 Series → 索引匹配 → 数据提取

当布尔对象为 ndarray 或 list 时,则按位置匹配:

go 复制代码
布尔数组 → 位置匹配 → 数据提取

基本语法:

css 复制代码
df[布尔对象]df.loc[布尔对象]df.iloc[布尔数组]

布尔对象通常由条件表达式生成,例如:

apache 复制代码
df["年龄"] > 25

多个条件可以通过逻辑运算符进行组合。例如:

bash 复制代码
df[(df["年龄"] > 25) & (df["城市"] == "北京")]

注意:

• 必须使用 &(逻辑与)、|(逻辑或)、~(逻辑非),不能使用 and、or、not

• 每个条件必须使用括号包裹

条件组合的本质是对布尔 Series 进行逐元素逻辑运算,因此必须使用按位逻辑运算符,并保证运算优先级正确。

1、按条件筛选行

首先,生成布尔 Series:

ini 复制代码
mask = df["年龄"] > 25

生成的 mask:

python 复制代码
A001    FalseA002     TrueA003     TrueName: 年龄, dtype: bool

然后,使用筛选:

bash 复制代码
df[mask]

或:

css 复制代码
df.loc[mask]

说明:当传入布尔对象时,DataFrame.getitem 会将其解释为行筛选。

返回:

go 复制代码
姓名  城市     收入  年龄A002  李四  上海  12000  30A003  王五  北京  10000  28

说明:

mask 是带索引的 Series,Pandas 按索引标签匹配,仅选择值为 True 的行。

2、按条件筛选列

首先,生成布尔数组。

ini 复制代码
col_mask = df.columns == "年龄"

col_mask 是基于列索引生成的布尔数组:

python 复制代码
[False False False  True]

列筛选为布尔数组按位置匹配:

css 复制代码
df.loc[:, col_mask]

返回单列 DataFrame:

go 复制代码
年龄A001  25A002  30A003  28

3、返回单列的条件筛选

若同时指定列标签,可返回单列 Series。

apache 复制代码
df.loc[df["年龄"] > 25, "姓名"]

返回:

cs 复制代码
A002    李四A003    王五Name: 姓名, dtype: object

4、布尔数组(无索引)筛选

若传入 NumPy 布尔数组:

python 复制代码
import numpy as np
mask_array = np.array([False, True, True])df[mask_array]

返回对应 True 的行:

go 复制代码
姓名  城市     收入  年龄A002  李四  上海  12000  30A003  王五  北京  10000  28

5、使用 .iloc 进行位置条件筛选

原理同上,利用布尔数组,.iloc 按整数位置筛选:

apache 复制代码
mask = df["年龄"] > 25df.iloc[mask.values]

说明:

布尔数组长度必须等于行数,否则抛出 IndexError。

📘 小结

DataFrame 的索引机制将"标签"与"位置"两套定位体系统一在同一结构之中。.loc 与 .iloc 分别对应标签访问与位置访问,.at 与 .iat 优化单值读取;布尔筛选则通过索引对齐或位置匹配完成数据提取。理解索引对象的查找与对齐机制,是掌握 Pandas 数据访问语义的核心。

"点赞有美意,赞赏是鼓励"

相关推荐
TRACER~8515 小时前
项目实战:pandas+pytest+allure+adb
adb·pandas·pytest
橘子编程18 小时前
Django全栈开发终极指南
后端·python·django·npm·html·pandas·html5
MediaTea19 小时前
Pandas:文件读写与数据接口
pandas
凌波粒2 天前
D2L学习笔记:安装、张量与数据处理
笔记·python·学习·pandas
沪漂阿龙4 天前
深入浅出 Pandas apply():从入门到向量化思维
人工智能·python·pandas
沪漂阿龙4 天前
深度解析Pandas数据组合:从concat到merge,打通你的数据处理任督二脉
python·数据分析·pandas
哈伦20194 天前
Python 生成随机数
python·机器学习·pandas
大数据魔法师5 天前
云南省天气数据可视化分析大屏的设计与实现(二)- 云南省各城市天气数据预处理
python·mysql·pandas
Hello.Reader5 天前
Apache Arrow 在 PySpark 中的使用提速 Pandas 转换与 UDF 的关键武器
apache·pandas