news 2026/5/13 1:18:07

模块二-数据选择与索引——09. query() 方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
模块二-数据选择与索引——09. query() 方法

09. query() 方法

1. 概述

query()方法是 Pandas 提供的一种使用字符串表达式进行数据筛选的方式。相比布尔索引,query()更简洁、可读性更强,特别适合复杂条件筛选。

importpandasaspdimportnumpyasnp# 创建示例数据np.random.seed(42)df=pd.DataFrame({'姓名':['张三','李四','王五','赵六','钱七','孙八','周九','吴十'],'年龄':[25,30,28,32,35,27,29,31],'工资':[8000,12000,10000,15000,11000,9500,10500,12500],'部门':['技术','销售','技术','市场','销售','技术','市场','销售'],'绩效':['A','B','A','A','C','B','A','B'],'工作年限':[2,5,3,8,6,2,4,7]})print("原始数据:")print(df)

2. query() 基础

2.1 基本语法

# query 使用字符串表达式df.query('表达式')

2.2 与布尔索引对比

# 布尔索引方式result_bool=df[df['年龄']>30]print("布尔索引:")print(result_bool)# query 方式result_query=df.query('年龄 > 30')print("\nquery 方式:")print(result_query)

对比:query 更简洁,不需要重复写df['列名']


3. 单条件查询

3.1 比较运算符

# 大于print(df.query('工资 > 10000'))# 小于print(df.query('年龄 < 30'))# 等于(注意:字符串需要用引号)print(df.query('部门 == "技术"'))# 不等于print(df.query('部门 != "技术"'))# 大于等于print(df.query('工作年限 >= 5'))

3.2 使用变量

# 使用 @ 符号引用外部变量min_salary=10000max_age=30result=df.query('工资 > @min_salary')print(f"工资 >{min_salary}:")print(result)result=df.query('年龄 < @max_age')print(f"\n年龄 <{max_age}:")print(result)

4. 多条件查询

4.1 使用 and / or

# and(与)result=df.query('工资 > 10000 and 部门 == "技术"')print("工资 > 10000 且 部门 == 技术:")print(result)# or(或)result=df.query('部门 == "技术" or 部门 == "市场"')print("\n部门 == 技术 或 部门 == 市场:")print(result)# 组合条件result=df.query('(工资 > 10000) and (部门 == "技术" or 绩效 == "A")')print("\n复杂组合:")print(result)

4.2 使用 & 和 |

# 也可以使用 & 和 |(但建议使用 and/or)result=df.query('工资 > 10000 & 部门 == "技术"')print("使用 &:")print(result)

5. 字符串方法

5.1 字符串包含

# 使用 str.contains()result=df.query('姓名.str.contains("张")')print("姓名包含'张':")print(result)# 不包含result=df.query('not 姓名.str.contains("张")')print("\n姓名不包含'张':")print(result)

5.2 字符串起始/结束

# 起始result=df.query('姓名.str.startswith("张")')print("姓名以'张'开头:")print(result)# 结束result=df.query('姓名.str.endswith("五")')print("\n姓名以'五'结尾:")print(result)

5.3 字符串长度

result=df.query('姓名.str.len() == 2')print("姓名为2个字符:")print(result)

6. 列表操作

6.1 in 操作

# 在列表中result=df.query('部门 in ["技术", "市场"]')print("部门是技术或市场:")print(result)# 不在列表中result=df.query('部门 not in ["技术", "市场"]')print("\n部门不是技术或市场:")print(result)

6.2 使用变量列表

target_depts=['技术','市场']result=df.query('部门 in @target_depts')print("使用变量列表:")print(result)

7. 区间查询

7.1 between 方法

# 年龄在 28-32 之间result=df.query('年龄.between(28, 32)')print("年龄在 28-32 之间:")print(result)# 工资在 9000-12000 之间result=df.query('工资.between(9000, 12000)')print("\n工资在 9000-12000:")print(result)

8. 算术运算

# 列之间运算result=df.query('工资 / 工作年限 > 2000')print("平均年资工资 > 2000:")print(result)# 复杂运算result=df.query('(工资 - 8000) / 工作年限 > 500')print("\n(工资-8000)/年限 > 500:")print(result)

9. 索引查询

# 设置索引df_indexed=df.set_index('姓名')print("设置索引后的数据:")print(df_indexed)# 按索引查询result=df_indexed.query('index == "张三"')print("\n索引为'张三':")print(result)# 索引 in 操作result=df_indexed.query('index in ["张三", "王五"]')print("\n索引为张三或王五:")print(result)

10. query() 高级特性

10.1 使用外部变量

# 使用 @ 引用外部变量min_age=28max_age=32target_dept='技术'result=df.query('年龄 >= @min_age and 年龄 <= @max_age and 部门 == @target_dept')print("使用多个外部变量:")print(result)

10.2 使用 Python 函数

# 自定义函数(需要在 query 外定义)defis_high_salary(salary):returnsalary>10000# query 中不能直接调用自定义函数,但可以使用 @ 调用# result = df.query('@is_high_salary(工资)') # 不推荐# 更好的做法:先创建辅助列df['高薪']=df['工资']>10000result=df.query('高薪 == True')print("高薪员工:")print(result)

10.3 使用 backtick 处理列名含空格

# 如果列名包含空格或特殊字符,使用反引号df_with_space=df.copy()df_with_space['年 薪']=df_with_space['工资']*12result=df_with_space.query('`年 薪` > 120000')print("年薪 > 120000:")print(result)

11. query() vs 布尔索引

特性query()布尔索引
语法字符串表达式Python 表达式
可读性复杂条件更清晰简单条件更直观
变量引用使用@直接使用
性能大数据集稍快小数据集相当
列名含空格支持(反引号)不支持
链式操作支持支持
# 复杂条件对比# 布尔索引result1=df[(df['工资']>10000)&(df['部门'].isin(['技术','市场']))&(df['年龄'].between(25,35))]# queryresult2=df.query('工资 > 10000 and 部门 in ["技术", "市场"] and 年龄.between(25, 35)')print("两种方式结果相同:")print(result1.equals(result2))# True

12. 完整示例:销售数据分析

# 创建销售数据np.random.seed(42)sales=pd.DataFrame({'产品':[f'产品_{i}'foriinrange(1,101)],'类别':np.random.choice(['电子产品','服装','食品','家居'],100),'价格':np.random.randint(50,5000,100),'销量':np.random.randint(10,500,100),'地区':np.random.choice(['华东','华南','华北','西南'],100),'评分':np.random.uniform(1,5,100).round(1)})print("="*60)print("销售数据分析(使用 query)")print("="*60)# 1. 高价值产品(价格 > 1000 且 销量 > 100)print("\n1. 高价值产品:")high_value=sales.query('价格 > 1000 and 销量 > 100')print(f"数量:{len(high_value)}")print(high_value.head())# 2. 电子产品且评分 > 4.5print("\n2. 电子产品且评分 > 4.5:")top_elec=sales.query('类别 == "电子产品" and 评分 > 4.5')print(top_elec[['产品','价格','销量','评分']])# 3. 华东地区销售额排名print("\n3. 华东地区销售额前5:")sales['销售额']=sales['价格']*sales['销量']east_top=sales.query('地区 == "华东"').nlargest(5,'销售额')print(east_top[['产品','销售额']])# 4. 使用变量筛选min_price=500max_price=2000min_rating=4.0filtered=sales.query('@min_price <= 价格 <= @max_price and 评分 >= @min_rating')print(f"\n4. 价格{min_price}-{max_price}且评分 >={min_rating}:")print(f"数量:{len(filtered)}")# 5. 分类统计print("\n5. 各分类高评分产品数量:")high_rating=sales.query('评分 >= 4.5')print(high_rating['类别'].value_counts())

13. 常见陷阱

陷阱说明解决方案
字符串引号字符串必须用引号query('部门 == "技术"')
变量引用外部变量需要用@query('工资 > @min_salary')
列名冲突列名与 Python 关键字冲突使用反引号:query('class== 1')
空值处理query 默认排除 NaN使用query('列 == 列')notna()
性能复杂表达式可能慢简单条件用布尔索引

14. 总结

操作query 语法布尔索引等价
大于'年龄 > 30'df['年龄'] > 30
等于'部门 == "技术"'df['部门'] == '技术'
'条件1 and 条件2'(条件1) & (条件2)
'条件1 or 条件2'`(条件1)
'not 条件'~(条件)
包含'列 in [a, b]'df['列'].isin([a,b])
区间'列.between(a, b)'df['列'].between(a,b)
字符串包含'列.str.contains("x")'df['列'].str.contains('x')
变量引用'列 > @var'直接使用

15. 使用建议

场景推荐方式
简单条件(1-2个)布尔索引
复杂条件(3+个)query()
需要可读性query()
动态生成的表达式query()
列名含空格/特殊字符query()
性能要求极高布尔索引

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

基于Node.js构建高效CLI工具:从原理到实践

1. 项目概述&#xff1a;一个为开发者赋能的命令行工具最近在整理自己的开发工具链时&#xff0c;发现很多重复性的脚手架搭建、项目初始化、依赖管理操作&#xff0c;虽然单个步骤不复杂&#xff0c;但组合起来既耗时又容易出错。这让我想起了之前接触过的一个开源项目&#x…

作者头像 李华
网站建设 2026/5/13 1:15:11

IGF-I Analog ;CYAAPLKPALSSC

一、基础信息多肽名称&#xff1a;IGF-I Analog 胰岛素样生长因子 I 类似物 三字母序列&#xff1a;Cys-Tyr-Ala-Ala-Pro-Leu-Lys-Pro-Ala-Lys-Ser-Cys 单字母序列&#xff1a;CYAAPLKPALSSC 氨基酸数量&#xff1a;12 aa 结构修饰&#xff1a;分子内二硫键 二硫键配对&#xf…

作者头像 李华
网站建设 2026/5/13 1:14:42

当资本垄断审美,《凰标》偏要立东方标准@凤凰标志

当资本把“国风”压缩成滤镜&#xff0c;把“东方”稀释成标签&#xff0c; 我们需要的不是另一场流量狂欢&#xff0c;而是一把能劈开垄断的刀。 ——题记 一、被资本托管的审美&#xff1a;一场长达数十年的“失语症” 资本审美特征东方美学原本模样被异化后的结果西式冲突叙…

作者头像 李华
网站建设 2026/5/13 1:14:37

如何为知识图谱选择合适的本体(Ontology)抽取方法

从业者指南&#xff1a;厘清图谱范式抽取技术选型——从经典规则模式方案到大模型驱动方案 面向生产级知识图谱的最优本体抽取方案——大模型 VS 模型微调 知识图谱的构建&#xff0c;概念上看似简单&#xff1a;抽取实体、识别关系&#xff0c;并将其结构化形成图谱。但所有实…

作者头像 李华
网站建设 2026/5/13 1:14:00

AI 应用开发的流程

AI 大模型的应用开发与传统软件开发相比&#xff0c;重心从“逻辑编码”转向了“上下文管理”和“模型调优”。目前主流的开发流程通常遵循以下五个核心阶段&#xff1a;1. 业务定义与技术选型在开始之前&#xff0c;需要确定 AI 在系统中的定位&#xff1a;是作为辅助插件&…

作者头像 李华
网站建设 2026/5/13 1:09:16

瑞芯微RK3288芯片-多种机型固件合集-刷机固件包

瑞芯微RK3288芯片-多种机型固件合集-刷机固件包 主要包括开博尔F6、天敏D8、大唐DTTV1000等等一些老旧型号的机顶盒。 刷机教程&#xff1a;https://blog.csdn.net/fatiaozhang9527/article/details/160994626?spm1001.2014.3001.5501 及固件包自带教程 刷机固件下载&#x…

作者头像 李华