news 2026/6/9 21:09:53

11.5 Pandas数据选取三大神器:loc、iloc与布尔索引完全指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
11.5 Pandas数据选取三大神器:loc、iloc与布尔索引完全指南

文章目录

  • 前言
  • 一、准备示例数据
  • 二、loc:基于标签的精准定位
  • 三、iloc:基于位置的灵活索引
  • 四、布尔索引:基于条件的智能筛选
  • 五、常见问题与解决方案
  • 总结

前言

各位数据爱好者和Python程序员们,大家好!今天我们来深入探讨Pandas中数据选取的三大核心技巧:loc、iloc和布尔索引。这些技巧是你进行高效数据分析和处理的必备利器。


为什么这些技巧如此重要?
想象一下,你面对一个包含数百万行的数据集,需要:
快速提取特定行和列的数据
根据条件筛选出符合要求的记录
精准定位并修改某些数据
如果没有正确掌握这些技巧,你可能会写出低效甚至错误的代码。让我们一起来看看如何正确使用它们!

一、准备示例数据

首先,让我们创建一个丰富的示例数据集,涵盖各种数据类型:

pythonimportpandasaspdimportnumpyasnp# 创建示例DataFramenp.random.seed(2023)data={'员工ID':[f'E{i:03d}'foriinrange(1,11)],'姓名':['张三','李四','王五','赵六','钱七','孙八','周九','吴十','郑十一','王十二'],'部门':['销售部','技术部','销售部','人事部','技术部','销售部','技术部','人事部','销售部','技术部'],'职级':['P7','P8','P6','P7','P8','P6','P7','P6','P7','P8'],'年龄':[25,32,28,35,29,26,33,31,27,34],'入职年份':[2018,2015,2019,2013,2017,2020,2016,2014,2019,2015],'月薪':[15000,28000,12000,22000,26000,11000,24000,18000,16000,30000],'绩效评分':[3.8,4.5,3.2,4.2,4.6,3.0,4.3,3.5,3.9,4.7],'是否已婚':[True,True,False,True,False,False,True,True,False,True]}df=pd.DataFrame(data)# 设置员工ID为索引df.set_index('员工ID',inplace=True)print("员工信息表:")print(df)print("\n数据形状:",df.shape)print("列名:",df.columns.tolist())

输出结果:

员工信息表: 员工ID 姓名 部门 职级 年龄 入职年份 月薪 绩效评分 是否已婚 E001 张三 销售部 P7252018150003.8True E002 李四 技术部 P8322015280004.5True E003 王五 销售部 P6282019120003.2False E004 赵六 人事部 P7352013220004.2True E005 钱七 技术部 P8292017260004.6False E006 孙八 销售部 P6262020110003.0False E007 周九 技术部 P7332016240004.3True E008 吴十 人事部 P6312014180003.5True E009 郑十一 销售部 P7272019160003.9False E010 王十二 技术部 P8342015300004.7True 数据形状:(10,8)列名:['姓名','部门','职级','年龄','入职年份','月薪','绩效评分','是否已婚']

二、loc:基于标签的精准定位

loc 使用行标签和列标签进行选择,可以精确地定位到具体的数据。

基本用法

pythonprint("=== loc方法示例 ===")# 1. 选择单行(返回Series)print("1. 选择员工E002的信息:")print(df.loc['E002'])print(f"数据类型:{type(df.loc['E002'])}")# 2. 选择多行print("\n2. 选择员工E001、E003、E005的信息:")print(df.loc[['E001','E003','E005']])# 3. 选择行切片(包含两端)print("\n3. 选择从E003到E006的员工:")print(df.loc['E003':'E006'])# 4. 选择特定行和列print("\n4. 选择E004的姓名和部门:")print(df.loc['E004',['姓名','部门']])print("\n5. 选择E002到E005的姓名、月薪、绩效评分:")print(df.loc['E002':'E005',['姓名','月薪','绩效评分']])# 5. 选择所有行的特定列print("\n6. 所有员工的姓名和年龄:")print(df.loc[:,['姓名','年龄']])# 6. 条件选择print("\n7. 月薪高于25000的员工姓名和月薪:")print(df.loc[df['月薪']>25000,['姓名','月薪']])

高级技巧:与条件表达式结合

pythonprint("\n=== loc高级技巧 ===")# 1. 多个条件组合print("1. 技术部且月薪>25000的员工:")condition=(df['部门']=='技术部')&(df['月薪']>25000)print(df.loc[condition,['姓名','月薪','绩效评分']])# 2. 使用isin方法print("\n2. 职级为P7或P8的员工:")condition=df['职级'].isin(['P7','P8'])print(df.loc[condition,['姓名','职级','月薪']])# 3. 字符串方法print("\n3. 姓王的员工:")condition=df['姓名'].str.startswith('王')print(df.loc[condition])# 4. 查询特定年龄范围的员工print("\n4. 年龄在30-35岁之间的员工:")condition=(df['年龄']>=30)&(df['年龄']<=35)print(df.loc[condition,['姓名','年龄','部门']])

三、iloc:基于位置的灵活索引

iloc 使用整数位置进行索引,从0开始计数,类似于Python的列表索引。

pythonprint("=== iloc方法示例 ===")# 1. 选择单行print("1. 选择第2行(索引为1):")print(df.iloc[1])# 2. 选择多行print("\n2. 选择第1、3、5行:")print(df.iloc[[0,2,4]])# 3. 行切片(不包含结束位置)print("\n3. 选择第3到第6行(不包含第6行):")print(df.iloc[2:6])# 4. 选择特定行和列print("\n4. 选择第2行第3列(姓名):")print(df.iloc[1,0])# 第2行,第1列print("\n5. 选择第2-4行,第1、3、5列:")print(df.iloc[1:4,[0,2,4]])# 姓名、职级、入职年份# 5. 选择所有行的特定列print("\n6. 所有行的第0列和第4列(姓名和月薪):")print(df.iloc[:,[0,5]])# 姓名、月薪# 6. 使用负数索引print("\n7. 最后3行数据:")print(df.iloc[-3:])print("\n8. 倒数第3行到最后1行,第1列到第3列:")print(df.iloc[-3:,0:3])

iloc与loc的区别

pythonprint("=== loc vs iloc 重要区别 ===")# 创建带非数字索引的示例test_df=pd.DataFrame({'A':[1,2,3,4,5],'B':['a','b','c','d','e']},index=['row1','row2','row3','row4','row5'])print("测试DataFrame:")print(test_df)print("\n使用loc选择行(基于标签):")print("test_df.loc['row2':'row4']:")print(test_df.loc['row2':'row4'])print("\n使用iloc选择行(基于位置):")print("test_df.iloc[1:4]:")print(test_df.iloc[1:4])print("\n⚠️ 重要提醒:")print("1. loc包含结束位置,iloc不包含结束位置")print("2. loc使用标签,iloc使用整数位置")print("3. 混合索引时特别注意区分")

四、布尔索引:基于条件的智能筛选

布尔索引是最灵活的数据筛选方式,可以根据任意条件组合来筛选数据。

基本布尔索引

pythonprint("=== 布尔索引基础 ===")# 1. 简单条件筛选print("1. 筛选技术部员工:")tech_dept=df['部门']=='技术部'print(df[tech_dept])# 2. 多个条件组合print("\n2. 技术部且月薪>25000的员工:")condition=(df['部门']=='技术部')&(df['月薪']>25000)print(df[condition])# 3. 或条件print("\n3. 技术部或人事部员工:")condition=(df['部门']=='技术部')|(df['部门']=='人事部')print(df[condition])# 4. 非条件print("\n4. 非销售部员工:")condition=~(df['部门']=='销售部')print(df[condition])

高级布尔索引技巧

pythonprint("\n=== 布尔索引高级技巧 ===")# 1. 使用query方法(更简洁)print("1. 使用query方法查询月薪>20000的员工:")print(df.query('月薪 > 20000'))print("\n2. 多条件query查询:")print(df.query('部门 == "技术部" and 绩效评分 > 4.0'))# 2. 使用between方法print("\n3. 年龄在25-30岁之间的员工:")condition=df['年龄'].between(25,30)print(df[condition])# 3. 使用字符串方法print("\n4. 姓名包含'十'的员工:")condition=df['姓名'].str.contains('十')print(df[condition])# 4. 处理缺失值print("\n5. 检查是否有空值(我们的示例数据没有):")print(df.isnull().any())# 添加一些缺失值来演示df_missing=df.copy()df_missing.loc['E003','绩效评分']=np.nan df_missing.loc['E006','年龄']=np.nanprint("\n添加缺失值后的DataFrame:")print(df_missing[['姓名','年龄','绩效评分']])print("\n6. 年龄不为空的员工:")condition=df_missing['年龄'].notnull()print(df_missing[condition][['姓名','年龄']])print("\n7. 绩效评分为空的员工:")condition=df_missing['绩效评分'].isnull()print(df_missing[condition][['姓名','绩效评分']])

五、常见问题与解决方案

  1. loc和iloc应该选哪个?
    使用loc当你知道标签(索引名或列名)时
    使用iloc当你知道位置(行号或列号)时
    在循环中或需要精确位置控制时,优先使用iloc

  2. 如何选择多列?

python# 选择相邻列df.loc[:,'姓名':'年龄']# 从姓名到年龄的所有列# 选择不相邻列df.loc[:,['姓名','月薪','绩效评分']]# 使用列位置范围df.iloc[:,0:3]# 前3列Q3:如何设置值? python# 设置单个值df.loc['E001','月薪']=16000# 设置整列df.loc[df['部门']=='技术部','绩效评分']=4.5# 根据条件设置不同值df.loc[df['月薪']>20000,'职级']='高级'df.loc[df['月薪']<=20000,'职级']='中级'

总结

loc:基于标签的精确选择,功能强大但相对较慢
iloc:基于位置的快速选择,适合大数据处理
布尔索引:基于条件的灵活筛选,逻辑清晰
关键要点:
总是优先使用loc和iloc,避免链式索引
在大数据集中,iloc通常比loc更快
复杂条件筛选时,布尔索引最直观
记住loc包含结束位置,iloc不包含结束位置
实践是最好的学习方式。建议你创建一个自己的数据集,尝试用不同的方法解决实际问题,逐步掌握这些强大的工具。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 12:52:46

机器学习在智能水泥基复合材料中的应用与实践

在人工智能与复合材料技术融合的背景下&#xff0c;复合材料的研究和应用正迅速发展&#xff0c;创新解决方案层出不穷。从复合材料性能的精确预测到复杂材料结构的智能设计&#xff0c;从数据驱动的材料结构优化到多尺度分析&#xff0c;人工智能技术正以其强大的数据处理能力…

作者头像 李华
网站建设 2026/6/10 11:03:55

Seed-Coder代码补全秘籍:免GPU云端方案,3步出效果

Seed-Coder代码补全秘籍&#xff1a;免GPU云端方案&#xff0c;3步出效果 你是不是也遇到过这种情况&#xff1a;作为一名Java工程师&#xff0c;看到Seed-Coder这种号称“能自动补全中间代码”的AI模型&#xff0c;心里痒痒想试试&#xff0c;结果一下载本地运行&#xff0c;…

作者头像 李华
网站建设 2026/6/10 11:05:59

Llama3 vs Llama2对比:代码生成能力提升实测教程

Llama3 vs Llama2对比&#xff1a;代码生成能力提升实测教程 1. 引言&#xff1a;为何关注Llama3的代码生成能力&#xff1f; 随着大语言模型在开发者社区中的广泛应用&#xff0c;代码生成能力已成为衡量模型实用性的重要指标。Meta于2024年4月发布的Llama 3系列&#xff0c…

作者头像 李华
网站建设 2026/5/24 12:15:32

Open Interpreter生产环境落地:中小企业AI编码部署方案

Open Interpreter生产环境落地&#xff1a;中小企业AI编码部署方案 1. 引言&#xff1a;AI编码助手的本地化需求与挑战 随着大模型技术在软件开发领域的深入应用&#xff0c;越来越多企业开始探索将AI编码助手集成到日常研发流程中。然而&#xff0c;对于中小企业而言&#x…

作者头像 李华
网站建设 2026/6/10 11:07:58

5分钟部署通义千问2.5-7B-Instruct,快速体验AI对话新高度

5分钟部署通义千问2.5-7B-Instruct&#xff0c;快速体验AI对话新高度 1. 引言 随着大语言模型技术的持续演进&#xff0c;通义千问系列推出了最新版本 Qwen2.5&#xff0c;显著提升了在知识理解、编程能力、数学推理以及结构化数据处理方面的表现。其中&#xff0c;Qwen2.5-7…

作者头像 李华
网站建设 2026/6/9 23:10:17

NotaGen镜像核心优势解析|附古典音乐生成完整教程

NotaGen镜像核心优势解析&#xff5c;附古典音乐生成完整教程 在AI创作逐渐渗透艺术领域的今天&#xff0c;音乐生成技术正经历从“随机旋律拼接”到“风格化作曲”的范式跃迁。传统MIDI序列模型受限于结构僵化、风格单一&#xff0c;难以复现古典音乐中复杂的和声进行与情感表…

作者头像 李华