完成 DataFrame 的构建之后下一步通常不是立刻统计或绘图而是先把真正有用的数据取出来。在实际工作中原始数据表往往包含较多字段和记录而分析任务通常只关注其中一部分。例如只查看数学成绩只筛选某个班级的数据或只保留若干关键列用于后续处理。由此可见数据选取Data Selection是 Pandas 中最常见、最基础的操作之一。本文围绕学生成绩表 scores说明如何从一张完整数据表中选出真正需要的数据包括按列选取、按行选取、按标签选取、按位置选取以及按条件筛选等常见方法。先构造本篇统一使用的 DataFrameimport 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、选取单列若只需要一列数据可直接使用列标签print(scores[数学])输出结果为一个 Series0 921 812 873 894 955 84Name: 数学, dtype: int64这里需要注意选取单列时结果通常是 Series而不是 DataFrame。2、选取多列若需要多列应将列名放入列表中print(scores[[学号, 姓名, 数学]])此时输出结果仍为 DataFrame学号 姓名 数学0 S001 张三 921 S002 李四 812 S003 王五 873 S004 赵六 894 S005 孙七 955 S006 周八 843、单列与多列结果类型的区别要特别注意的是• scores[数学] 返回 Series• scores[[数学]] 返回 DataFrame示例print(type(scores[数学]))print(type(scores[[数学]]))输出结果类似于class pandas.core.series.Seriesclass pandas.core.frame.DataFrame这一差异十分重要因为后续可用的方法与结果结构并不完全相同。三、选取一行或多行数据与列选取相比行选取更适合处理“记录”Record层面的任务例如查看某位学生的信息或取前几条数据作为样本。1、通过切片取前几行Pandas 支持类似列表的切片形式print(scores[0:3])输出结果为前 3 行学号 姓名 班级 语文 数学 英语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 行print(scores.iloc[0])输出结果为一个 Series表示“张三”这一行的所有字段。3、选取多行例如按位置取前两行print(scores.iloc[0:2])若按标签取指定几行则需要配合 .loc[] 使用。不过更规范、更常用的行列选取方式通常还是 .loc[] 与 .iloc[]。四、使用 .loc[] 按标签选取数据按标签Label选取本质上是按索引标签或列标签选取。在 Pandas 中最典型的方法是 .loc[]。1、基本形式scores.loc[行标签, 列标签]2、按名称选取一行print(scores.loc[0])若当前仍使用默认整数索引那么行标签就是 0、1、2...。这里虽然看起来与位置编号相同但在 .loc[] 中它们仍被视为“标签”只是当前默认索引恰好是整数标签。3、按名称选取若干列print(scores.loc[:, [姓名, 数学, 英语]])这里: 表示所有行[姓名, 数学, 英语] 表示所选列。4、访问单个元素若同时指定行标签与列标签可返回单元格值标量。print(scores.loc[2, 英语])建议使用 .at[] 进行快速地单个元素按标签访问print(scores.at[2, 英语])5、同时选取若干行和若干列print(scores.loc[0:2, [姓名, 数学, 英语]])需要注意的是.loc[] 中的区间是闭区间。也就是说0:2 会包含 0、1、2 三行。6、将“学号”设为索引后再按名称选取若希望真正按学号名称选取数据可先使用 set_index() 设置索引scores_by_id scores.set_index(学号)print(scores_by_id.loc[S003])这样会直接得到学号为 S003 的学生信息。五、使用 .iloc[] 按位置选取数据按位置选取本质上是不看标签只看位置编号。Pandas 中对应的方法是 .iloc[]。1、基本形式scores.iloc[行位置, 列位置]2、选取单行print(scores.iloc[0])表示第 0 行。3、选取单列print(scores.iloc[:, 4])位置编号通常从 0 开始因此第 4 列对应“数学”这一列。4、访问单个元素若同时指定单个行位置与列位置可返回单元格值标量。print(scores.iloc[2, 5])建议使用 .iat[] 进行快速地单个元素按位置访问print(scores.iat[2, 5])5、同时选取若干行和若干列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、单个条件print(scores[scores[数学] 90])输出学号 姓名 班级 语文 数学 英语0 S001 张三 C01 88 92 854 S005 孙七 C03 91 95 90查看控制筛选的布尔序列mask scores[数学] 90print(mask)输出0 True1 False2 False3 False4 True5 FalseName: 数学, dtype: bool2、按文本条件筛选print(scores[scores[班级] C02])3、按集合筛选若需要筛选某几类值可使用 isin()print(scores[scores[班级].isin([C01, C03])])这表示只保留 C01 和 C03 的记录。4、使用 query()对于较直观的条件表达式也可以使用 query()print(scores.query(数学 90))print(scores.query(班级 C02))当列名较简单时query() 的表达式通常较直观但若列名中包含空格或某些特殊字符表达式书写会更复杂因此初学阶段宜先掌握普通布尔筛选。七、处理多个筛选条件实际分析中往往需要同时满足多个条件。例如• 班级为 C03且数学成绩大于 90• 语文成绩大于等于 85且英语成绩大于等于 88这时需要组合多个布尔条件。1、“且”条件print(scores[(scores[班级] C03) (scores[数学] 90)])2、“或”条件|print(scores[(scores[数学] 90) | (scores[英语] 90)])3、“非”条件~print(scores[~(scores[班级] C01)])4、条件组合时必须加括号这是一个常见注意点。在 Pandas 中组合多个条件时每个条件都应放在括号中例如(scores[数学] 90) (scores[英语] 88)而不能省略括号。例如将语文、数学、英语均不低于 88 的学生视为成绩优秀excellent scores[ (scores[语文] 88) (scores[数学] 88) (scores[英语] 88)] print(excellent)这类组合筛选在实际分析中极为常见。 小结数据选取是 Pandas 中最常见的基础操作。无论是按列、按行、按标签、按位置还是按条件筛选其核心目的都是先从完整表格中准确缩小分析范围。只有先拿到真正需要的数据后续的清洗、统计与可视化才有明确对象。延伸阅读《Pandas 索引机制与数据访问》“点赞有美意赞赏是鼓励”