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 数据访问语义的核心。

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