新闻详情

新闻详情

首页 / 资讯中心 / 详情

pandas 入门教程:如何从 DataFrame 中选取数据子集(列选择、行过滤与 loc/iloc 实战指南)

发布时间:2026/9/19 0:19:11来源:尧图网络
pandas 入门教程:如何从 DataFrame 中选取数据子集(列选择、行过滤与 loc/iloc 实战指南)
pandas 入门教程如何从 DataFrame 中选取数据子集列选择、行过滤与 loc/iloc 实战指南【免费下载链接】pandasFlexible and powerful data analysis / manipulation library for Python, providing labeled data structures similar to R data.frame objects, statistical functions, and much more项目地址: https://gitcode.com/gh_mirrors/pa/pandas本文基于 pandas 官方入门教程《How do I select a subset of a DataFrame?》仓库路径 doc/source/getting_started/intro_tutorials/03_subset_data.rst展开以泰坦尼克号乘客数据doc/data/titanic.csv为实战数据集系统讲解 pandas 中最核心也最常用的数据子集选取方法用方括号[]选取单列/多列、用条件表达式过滤行、用loc/iloc同时选取行与列并完成赋值。读完本文你将掌握 pandas 数据选取的完整工具箱并理解其底层实现机制。准备工作加载 Titanic 数据集本教程使用泰坦尼克号乘客数据集以 CSV 格式存储。首先用pd.read_csv读取import pandas as pd titanic pd.read_csv(doc/data/titanic.csv) titanic.head()数据集的列结构如下详见 doc/source/getting_started/intro_tutorials/includes/titanic.rst列名含义PassengerId每位乘客的编号Survived是否幸存0表示否1表示是Pclass三种舱位等级之一1、2、3Name乘客姓名Sex乘客性别Age乘客年龄岁SibSp同船兄弟姐妹或配偶的数量Parch同船父母或子女的数量Ticket乘客的船票编号Fare票价Cabin乘客的舱房号Embarked登船港口该数据集共 891 行乘客。下文所有示例都建立在这个 DataFrame 之上。如何选取 DataFrame 中的特定列选取单个列返回 Series假如我们只关心泰坦尼克乘客的年龄ages titanic[Age] ages.head()使用方括号[]并在其中放入感兴趣的列名即可选取单个列。注意这里的[]与 Python 列表、字典的取值语法同源——事实上pandas 正是复用了 Python 的__getitem__协议来实现列选取。从源码看DataFrame.__getitem__在 pandas/core/frame.py 中实现当传入的 key 是单个可哈希标量时pandas 通过self.columns.get_loc(key)定位列位置命中唯一列就直接以_get_item(key)返回该列的Series当 key 是列表等 list-like 对象时则走self.columns._get_indexer_strict(key, columns)得到位置索引再通过self.take(indexer, axis1)取回一个DataFrame。这正是选单列得 Series、选多列得 DataFrame这一行为差异的底层来源。可以用type()和shape验证返回类型type(titanic[Age]) # pandas.core.series.Series titanic[Age].shape # (891,)DataFrame 中的每一列都是一个 Series。选取单列时返回的是一个一维的 pandas Series因此shape只返回行数(891,)。这里特别提醒shape是属性attribute不是方法method调用时不要加括号——这与读取/写入教程中的约定一致参见 读取与写入教程 中关于属性的说明。选取多个列返回 DataFrame假如我们同时关心乘客的年龄和性别age_sex titanic[[Age, Sex]] age_sex.head()选取多列时需要在选择方括号[]内放入一个列名列表。注意这里有两层方括号含义完全不同——内层方括号定义的是一个 Python 列表即列名组成的 list外层方括号用于从 pandas DataFrame 中做选取。这是初学者最容易混淆的地方。返回值类型验证type(titanic[[Age, Sex]]) # pandas.core.frame.DataFrame titanic[[Age, Sex]].shape # (891, 2)选择返回了一个包含891 行、2 列的 DataFrame。请记住DataFrame 是二维的同时具有行维度和列维度。如何过滤 DataFrame 中的特定行用条件表达式过滤行布尔索引假如我们想知道年龄大于 35 岁的乘客above_35 titanic[titanic[Age] 35] above_35.head()要基于条件表达式选取行把条件放进选择方括号[]内即可。这里的核心机制是布尔索引boolean indexing。先单独看方括号内的条件titanic[Age] 35条件表达式、、!、、等比较运算符都适用的输出实际上是一个与原始 DataFrame行数相同的布尔值 Series每个元素为True或False。把这个布尔 Series 放入选择方括号[]中pandas 就只会保留值为True的行。从源码可以印证这条路径pandas/core/frame.py 中的__getitem__检测到com.is_bool_indexer(key)后会调用_getitem_bool_array先检查布尔索引长度是否与 DataFrame 行数一致长度不一致会抛出ValueError再通过key.nonzero()得到命中的行位置最终用self.take(indexer, axis0)取出这些行——因此这是一个按位置取行的过滤操作返回的仍是 DataFrame。原始 Titanic DataFrame 共有 891 行看看满足条件的行数above_35.shape # (217, 12)用 isin 过滤行值是否在给定列表中假如我们关心舱位等级为 2 和 3 的乘客class_23 titanic[titanic[Pclass].isin([2, 3])] class_23.head()与条件表达式类似Series.isin条件函数会对每一行返回True/False只要该行的值出现在传入的列表中就返回True。把titanic[Pclass].isin([2, 3])放进选择方括号[]即可完成过滤它检查的是Pclass列的值是否为 2 或 3。从源码看Series.isin定义于 pandas/core/series.py其文档字符串明确说明返回一个布尔 Series表示 Series 中每个元素是否与传入的values序列中的某个元素精确匹配。需要注意一个易错点传入单个字符串会抛出TypeError正确做法是把单个字符串包成一个单元素列表如[A]。如需取反可用~运算符例如~titanic[Pclass].isin([2, 3])表示舱位不是 2 或 3。上面的写法与分别判断Pclass等于 2、等于 3再用|或运算符合并完全等价class_23 titanic[(titanic[Pclass] 2) | (titanic[Pclass] 3)] class_23.head()注意合并多个条件时每个条件都必须用括号()括起来。此外不能使用 Python 关键字or/and而必须使用|或运算符和与运算符。若想取反单个条件使用~非运算符。用 notna 过滤行排除缺失值假如我们只想分析年龄已知的乘客数据age_no_na titanic[titanic[Age].notna()] age_no_na.head()Series.notna条件函数对每一行返回True表示该行的值不是缺失值Null。把它放进选择方括号[]中即可过滤出不含缺失值的行。这里要注意仅看前 5 行时结果可能与原数据完全一样因为前几行年龄恰好都非空。一个可靠的验证方式是检查shape是否发生了变化age_no_na.shape # (714, 12)原始数据有 891 行过滤后只剩 714 行——说明有 177 个乘客的年龄是缺失的已被成功过滤。notna的底层实现位于 pandas/core/indexes/base.py返回numpy.ndarray[np.bool_]类型的布尔数组DataFrame 的布尔索引路径会自动识别并应用它。关于缺失值处理的更多专用函数可参考用户指南中的 缺失数据处理章节。如何同时选取 DataFrame 中的特定行和特定列用 loc 按标签/条件选取行列假如我们想知道年龄大于 35 岁的乘客的姓名adult_names titanic.loc[titanic[Age] 35, Name] adult_names.head()当需要一次性同时选取行和列的子集时仅靠选择方括号[]已经不够了——必须在方括号前加上loc/iloc运算符。使用loc/iloc时逗号之前的部分指定要选取的行逗号之后的部分指定要选取的列。当使用列名、行标签或条件表达式时使用loc运算符。loc逗号前后两部分都支持以下几种形式单个标签single label标签列表list of labels标签切片slice of labels条件表达式conditional expression冒号:表示选取所有行或所有列从源码看loc与iloc都继承自 pandas/core/indexing.py 中的_LocationIndexer基类而_LocIndexerpandas/core/indexing.py与_iLocIndexerpandas/core/indexing.py分别实现了标签驱动与位置驱动两种索引解析逻辑。loc的关键特性是左闭右闭两端都包含且按行/列标签定位iloc则遵循 Python 切片的左闭右开规则按整数位置定位。这是两者最容易踩坑的差异。用 iloc 按位置选取行列假如我们想看第 10 行到第 25 行、第 3 列到第 5 列的数据titanic.iloc[9:25, 2:5]当基于表格中的位置position来选取行和/或列时使用iloc运算符。上面的写法表示行方向取位置 9 到 24Python 切片语义25 不包含列方向取位置 2 到 45 不包含得到的是一个行列子集的 DataFrame。与loc的差异iloc使用与 Python 列表切片一致的左闭右开区间且索引从 0 开始loc使用标签且区间两端都包含。例如titanic.loc[9:25, Age:Fare]与titanic.iloc[9:25, 2:5]看似相近实际语义截然不同。基于 loc/iloc 的选择支持赋值使用loc或iloc选取特定行/列后可以向选中的位置赋予新值。例如把第四列的前 3 个元素改成字符串anonymoustitanic.iloc[0:3, 3] anonymous titanic.iloc[:5, 3]第一行语句选中第 0 到 2 行、第 3 列的区域并整体赋值第二行语句则读取前 5 行的第 3 列用于确认结果——前 3 个值已变为anonymous。赋值的底层由_LocationIndexer._get_setitem_indexerpandas/core/indexing.py负责它会先把基于标签或条件的 key 转换成位置索引器positional indexer再执行写入从而保证loc/iloc的赋值与取值使用同一套解析规则、行为一致。总结与速记以下是本教程的要点速记对应原文档 REMEMBER 框选取数据子集时使用方括号[]在方括号内可以使用单个列/行标签、标签列表、标签切片、条件表达式或冒号loc用于基于标签的选取使用行名/列名区间两端包含iloc用于基于位置的选取使用表格中的整数位置区间左闭右开可以基于loc/iloc的选取结果直接赋值新值。三张示意图分别对应本文的三类操作可对照记忆单列/多列选取titanic[Age]、titanic[[Age, Sex]]、按条件过滤行titanic[titanic[Age] 35]、isin、notna、用loc/iloc同时选取行列titanic.loc[cond, Name]、titanic.iloc[9:25, 2:5]。如需进一步深入本仓库还提供了更系统的资料关于索引与选取的基础知识参见用户指南的 索引与选取数据章节其中包含布尔索引的专门讨论indexing.boolean、isin的专门讨论indexing.basics.indexing_isin以及loc/iloc不同选择方式indexing.choice的对比。原始教程页位于 03_subset_data.rst练习数据为 doc/data/titanic.csv读者可以随时回到仓库中对照源码pandas/core/frame.py、pandas/core/series.py、pandas/core/indexing.py验证本文提到的每一条行为。【免费下载链接】pandasFlexible and powerful data analysis / manipulation library for Python, providing labeled data structures similar to R data.frame objects, statistical functions, and much more项目地址: https://gitcode.com/gh_mirrors/pa/pandas创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Linux Suspend/Resume 内核级深度解析:从用户态到ACPI固件的全流程拆解 2026/9/19 1:13:18

Linux Suspend/Resume 内核级深度解析:从用户态到ACPI固件的全流程拆解

1. 这不是“按个键就休眠”的黑箱——它是一场横跨用户空间与内核空间的精密协同作战Linux 的 Suspend/Resume,远不止是笔记本合盖后屏幕一黑、再开盖就恢复工作的简单动作。它是一套覆盖整个软件栈的系统级状态迁移机制,涉及从桌面环境(如 G…

阅读更多 →
Fluent UDF入门:编译型与解释型、DEFINE_PROFILE与动网格 2026/9/19 1:13:18

Fluent UDF入门:编译型与解释型、DEFINE_PROFILE与动网格

简介:这份《UDF官方教程之1.Introduction to UDF》是ANSYS Fluent官方培训体系中的入门讲义,面向需要突破标准界面限制的流体仿真工程师、高校研究生及CFD进阶学习者,帮助其理解用户自定义函数的定位与适用边界。内容围绕UDF是什么、为何要创…

阅读更多 →
红外通信F题实战:链路预算、收发电路与抗干扰调参全解析 2026/9/19 1:13:18

红外通信F题实战:链路预算、收发电路与抗干扰调参全解析

简介:2013年全国大学生电子设计竞赛红外光通信装置(F题)的完整设计文档,系统阐述了信号产生、红外光发送与接收三大模块的实现方案,面向电子竞赛参赛者、电子设计初学者及红外通信爱好者,适用于课程设计与备…

阅读更多 →
计数器与累加器:从RTL设计到FPGA板级调试的完整指南 2026/9/19 1:13:18

计数器与累加器:从RTL设计到FPGA板级调试的完整指南

简介:针对数字系统设计课程中的计数器和累加器实验,这份PDF实验报告系统记录了从设计到验证的完整过程。报告面向数字电路与FPGA设计的初学者,以实验五和实验六两条主线展开:一方面用图形法和Verilog HDL语言设计十进制计数器&…

阅读更多 →
电镀预处理龙门线走法表:PLC数据寄存器与状态机实现 2026/9/19 1:13:18

电镀预处理龙门线走法表:PLC数据寄存器与状态机实现

简介:这份PDF面向电镀生产线自动化控制、PLC编程及工业设备改造领域的工程技术人员与相关专业师生,围绕预处理龙门线走法编程自由度不足的问题,给出利用PLC数据寄存器结合步进程序的实践思路。资料为1个PDF文件,压缩包约208KB&…

阅读更多 →
Android UseCase设计指南:解耦业务逻辑与平台实现 2026/9/19 1:10:18

Android UseCase设计指南:解耦业务逻辑与平台实现

1. UseCase不是“用例”,而是Android架构里的责任守门人很多人第一次看到UseCase这个词,下意识就联想到UML里的“用例图”——画几个小人、几个椭圆,标上“登录”“支付”“上传头像”。但Android开发里提到的UseCase,和那个教科书…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞