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

需要注意,scores[0: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 :索引机制与数据访问

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

相关推荐
萤萤七悬2 小时前
【人工智能训练师3级】考试准备(2026)四、简答题 1.2.1-1.2.5
人工智能
小陈工2 小时前
Python Web开发入门(十二):使用Flask-RESTful构建API——让后端开发更优雅
开发语言·前端·python·安全·oracle·flask·restful
永霖光电_UVLED2 小时前
当前 AR 眼镜显示技术面临的“人类视觉因素”瓶颈与半导体全息调制器
人工智能·架构
MediaTea2 小时前
AI 术语通俗词典:协方差
人工智能
无心水2 小时前
20、Spring陷阱:Feign AOP切面为何失效?配置优先级如何“劫持”你的设置?
java·开发语言·后端·python·spring·java.time·java时间处理
chenglin0162 小时前
AI应用性能优化与生产环境部署
人工智能·性能优化
mit6.8242 小时前
量子计算
人工智能
中金快讯2 小时前
济民健康医疗服务占比提升至46%!业务结构调整初见成效
大数据·人工智能
南湖北漠2 小时前
记录生活中的一件小事(佚名整理)
网络·人工智能·计算机网络·其他·安全·生活