Pandas 操作指南(二):数据选取与条件筛选

完成 DataFrame 的构建之后,下一步通常不是立刻统计或绘图,而是先把真正有用的数据取出来。

在实际工作中,原始数据表往往包含较多字段和记录,而分析任务通常只关注其中一部分。例如,只查看数学成绩,只筛选某个班级的数据,或只保留若干关键列用于后续处理。由此可见,数据选取(Data Selection)是 Pandas 中最常见、最基础的操作之一。

本文围绕学生成绩表 scores,说明如何从一张完整数据表中选出真正需要的数据,包括按列选取、按行选取、按标签选取、按位置选取以及按条件筛选等常见方法。

先构造本篇统一使用的 DataFrame:

python 复制代码
import pandas as pd
students = [    {"学号": "S001", "姓名": "张三", "班级": "C01", "语文": 88, "数学": 92, "英语": 85},    {"学号": "S002", "姓名": "李四", "班级": "C01", "语文": 76, "数学": 81, "英语": 79},    {"学号": "S003", "姓名": "王五", "班级": "C02", "语文": 90, "数学": 87, "英语": 93},    {"学号": "S004", "姓名": "赵六", "班级": "C02", "语文": 85, "数学": 89, "英语": 88},    {"学号": "S005", "姓名": "孙七", "班级": "C03", "语文": 91, "数学": 95, "英语": 90},    {"学号": "S006", "姓名": "周八", "班级": "C03", "语文": 78, "数学": 84, "英语": 80}]
scores = pd.DataFrame(students)print(scores)

一、数据选取是最常见的操作

在表格数据处理中,完整数据表只是起点,而不是终点。

真正的分析任务往往具有明确目标,例如:

只查看"数学"这一列;

只分析 C02 班的学生成绩;

只取前 3 行作为示例;

同时保留"学号、姓名、数学"三列;

找出数学成绩大于 90 的学生。

这些操作的共同点在于:先缩小分析范围,再进入后续处理。

从数据处理流程看,数据选取具有三方面意义。

第一,它能够减少无关信息。

一张表中并非所有字段都与当前任务相关。若不先选出所需部分,后续计算与阅读都会受到干扰。

第二,它能够明确分析对象。

分析某一列,本质上是在明确"分析什么";筛选某几行,本质上是在明确"分析谁"。

第三,它是后续清洗、统计与可视化的前提。

许多操作都建立在"已经拿到目标数据"这一基础之上。因此,数据选取不是附属步骤,而是正式分析之前的核心步骤。

二、选取一列或多列数据

在 Pandas 中,列通常表示字段(Field)或特征(Feature),因此按列选取是最常见的操作形式。

1、选取单列

若只需要一列数据,可直接使用列标签:

bash 复制代码
print(scores["数学"])

输出结果为一个 Series:

apache 复制代码
0    921    812    873    894    955    84Name: 数学, dtype: int64

这里需要注意:选取单列时,结果通常是 Series,而不是 DataFrame。

2、选取多列

若需要多列,应将列名放入列表中:

bash 复制代码
print(scores[["学号", "姓名", "数学"]])

此时输出结果仍为 DataFrame:

go 复制代码
学号  姓名  数学0  S001  张三  921  S002  李四  812  S003  王五  873  S004  赵六  894  S005  孙七  955  S006  周八  84

3、单列与多列结果类型的区别

要特别注意的是:

• scores"数学" 返回 Series

• scores\["数学"] 返回 DataFrame

示例:

bash 复制代码
print(type(scores["数学"]))print(type(scores[["数学"]]))

输出结果类似于:

objectivec 复制代码
<class 'pandas.core.series.Series'><class 'pandas.core.frame.DataFrame'>

这一差异十分重要,因为后续可用的方法与结果结构并不完全相同。

三、选取一行或多行数据

与列选取相比,行选取更适合处理"记录"(Record)层面的任务,例如查看某位学生的信息,或取前几条数据作为样本。

1、通过切片取前几行

Pandas 支持类似列表的切片形式:

apache 复制代码
print(scores[0:3])

输出结果为前 3 行:

go 复制代码
学号  姓名  班级  语文  数学  英语0  S001  张三  C01  88  92  851  S002  李四  C01  76  81  792  S003  王五  C02  90  87  93

需要注意,scores0:3 之所以能得到前 3 行,是因为这里使用的是切片语法;但 DataFrame... 一般更常用于列选择,因此按行选取时,更推荐使用 .iloc\[\] 或 .loc\[\],语义会更清楚。

2、选取单行

若只取一行,常用 .loc\[\] 或 .iloc\[\],后文会详细说明。

例如,按位置取第 0 行:

apache 复制代码
print(scores.iloc[0])

输出结果为一个 Series,表示"张三"这一行的所有字段。

3、选取多行

例如按位置取前两行:

apache 复制代码
print(scores.iloc[0:2])

若按标签取指定几行,则需要配合 .loc\[\] 使用。

不过,更规范、更常用的行列选取方式,通常还是 .loc\[\] 与 .iloc\[\]。

四、使用 .loc\[\] 按标签选取数据

按标签(Label)选取,本质上是按索引标签或列标签选取。在 Pandas 中,最典型的方法是 .loc\[\]。

1、基本形式

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

2、按名称选取一行

apache 复制代码
print(scores.loc[0])

若当前仍使用默认整数索引,那么行标签就是 0、1、2...。

这里虽然看起来与位置编号相同,但在 .loc\[\] 中,它们仍被视为"标签",只是当前默认索引恰好是整数标签。

3、按名称选取若干列

bash 复制代码
print(scores.loc[:, ["姓名", "数学", "英语"]])

这里,: 表示所有行,"姓名", "数学", "英语" 表示所选列。

4、访问单个元素

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

apache 复制代码
print(scores.loc[2, "英语"])

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

apache 复制代码
print(scores.at[2, "英语"])

5、同时选取若干行和若干列

bash 复制代码
print(scores.loc[0:2, ["姓名", "数学", "英语"]])

需要注意的是,.loc\[\] 中的区间是闭区间。

也就是说,0:2 会包含 0、1、2 三行。

6、将"学号"设为索引后再按名称选取

若希望真正按学号名称选取数据,可先使用 set_index() 设置索引:

bash 复制代码
scores_by_id = scores.set_index("学号")print(scores_by_id.loc["S003"])

这样会直接得到学号为 "S003" 的学生信息。

五、使用 .iloc\[\] 按位置选取数据

按位置选取,本质上是不看标签,只看位置编号。Pandas 中对应的方法是 .iloc\[\]。

1、基本形式

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

2、选取单行

apache 复制代码
print(scores.iloc[0])

表示第 0 行。

3、选取单列

apache 复制代码
print(scores.iloc[:, 4])

位置编号通常从 0 开始,因此第 4 列对应"数学"这一列。

4、访问单个元素

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

apache 复制代码
print(scores.iloc[2, 5])

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

apache 复制代码
print(scores.iat[2, 5])

5、同时选取若干行和若干列

apache 复制代码
print(scores.iloc[0:3, 1:5])

这表示:选取第 0 到第 2 行,选取第 1 到第 4 列。

与 .loc\[\] 不同,.iloc\[\] 使用的是左闭右开区间,因此 0:3 不包含第 3 行。

6、.loc\[\] 与 .iloc\[\] 的区别

可以概括为:

• .loc\[\] 按标签选取

• .iloc\[\] 按位置选取

这是 Pandas 选取操作中最重要的区分之一。

六、按条件筛选数据

很多时候,分析对象不是由固定位置决定,而是由某种条件决定。例如,筛选数学成绩大于 90 的学生,或选出班级为 C01 的记录。

这类操作称为条件筛选(Conditional Filtering),其本质是先生成布尔序列,然后根据 True / False 选择数据区域。

1、单个条件

apache 复制代码
print(scores[scores["数学"] > 90])

输出:

go 复制代码
学号  姓名  班级  语文  数学  英语0  S001  张三  C01  88  92  854  S005  孙七  C03  91  95  90

查看控制筛选的布尔序列:

apache 复制代码
mask = scores["数学"] > 90print(mask)

输出:

python 复制代码
0     True1    False2    False3    False4     True5    FalseName: 数学, dtype: bool

2、按文本条件筛选

bash 复制代码
print(scores[scores["班级"] == "C02"])

3、按集合筛选

若需要筛选某几类值,可使用 isin():

css 复制代码
print(scores[scores["班级"].isin(["C01", "C03"])])

这表示只保留 C01 和 C03 的记录。

4、使用 query()

对于较直观的条件表达式,也可以使用 query():

bash 复制代码
print(scores.query("数学 > 90"))print(scores.query("班级 == 'C02'"))

当列名较简单时,query() 的表达式通常较直观;但若列名中包含空格或某些特殊字符,表达式书写会更复杂,因此初学阶段宜先掌握普通布尔筛选。

七、处理多个筛选条件

实际分析中,往往需要同时满足多个条件。例如:

• 班级为 C03,且数学成绩大于 90

• 语文成绩大于等于 85,且英语成绩大于等于 88

这时需要组合多个布尔条件。

1、"且"条件:&

apache 复制代码
print(scores[(scores["班级"] == "C03") & (scores["数学"] > 90)])

2、"或"条件:|

apache 复制代码
print(scores[(scores["数学"] > 90) | (scores["英语"] > 90)])

3、"非"条件:~

bash 复制代码
print(scores[~(scores["班级"] == "C01")])

4、条件组合时必须加括号

这是一个常见注意点。

在 Pandas 中组合多个条件时,每个条件都应放在括号中,例如:

css 复制代码
(scores["数学"] > 90) & (scores["英语"] > 88)

而不能省略括号。

例如,将语文、数学、英语均不低于 88 的学生视为成绩优秀:

bash 复制代码
excellent = scores[    (scores["语文"] >= 88) &    (scores["数学"] >= 88) &    (scores["英语"] >= 88)]
print(excellent)

这类组合筛选在实际分析中极为常见。

📘 小结

数据选取是 Pandas 中最常见的基础操作。无论是按列、按行、按标签、按位置,还是按条件筛选,其核心目的都是先从完整表格中准确缩小分析范围。只有先拿到真正需要的数据,后续的清洗、统计与可视化才有明确对象。

延伸阅读:

Pandas :索引机制与数据访问

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

相关推荐
OpenAnolis小助手10 小时前
如何利用 AI Agent 实现热补丁的自动化生成
人工智能·安全·ai·操作系统·agent·龙蜥
米核AI易山10 小时前
扣子工作流项目交付全流程:从需求分析到上线维护的实战方法论
人工智能·需求分析·coze·扣子工作流·米核ai易山
沫儿笙10 小时前
弧焊机器人保护气智能节气阀
人工智能·机器人
DS随心转插件10 小时前
AI 导出鸭实操教程:Markdown 转 Word 高效协作与隐私交付实战指南
人工智能·ai·word·豆包·deepseek·ai导出鸭
腾讯云开发者10 小时前
探访香港科创高地,洞见 Agentic AI 时代的出海新范式
人工智能
产业家10 小时前
“绿算协同×Token工厂”新范式,润建股份探索出一个AI新样本
人工智能
暗夜猎手-大魔王10 小时前
hermes源码学习8-上下文压缩与缓存
人工智能·缓存
申通之声11 小时前
以体验和AI重构竞争力,申通要“构建生态共同体”
大数据·网络·人工智能·重构·交通物流
terry60011 小时前
2026图形验证码服务商横向测评|口碑、接入、安全选型全指南
java·大数据·人工智能·web安全·信息与通信·数据库架构
Parry11 小时前
用语种检测、翻译、纠错和情感分析构建多语言内容审核 Agent
人工智能