当前位置: 首页 > news >正文

Pandas query() 方法详解

Pandas query() 方法详解

query() 是 Pandas 中一个非常强大的方法,它允许你使用字符串表达式来筛选数据行。这种方法比传统的布尔索引更简洁、更易读。

基本语法

df.query(expr, inplace=False, **kwargs)
  • expr: 查询字符串表达式
  • inplace: 是否原地修改 DataFrame (默认为 False)
  • **kwargs: 其他关键字参数
  • 对于大型 DataFrame,query() 通常比布尔索引快,因为它在底层使用了 numexpr 库
  • 但对于小型 DataFrame,传统布尔索引可能更快

基本用法

1. 简单条件查询

import pandas as pddf = pd.DataFrame({'A': range(1, 6),'B': range(10, 60, 10),'C': ['a', 'b', 'c', 'd', 'e']
})# 查询 A 列大于 2 的行
result = df.query('A > 2')

2. 多条件查询

# AND 条件
df.query('A > 2 & B < 50')# OR 条件
df.query('A > 4 | B == 20')# 使用括号明确优先级
df.query('(A > 2) & (B < 50)')

3. 字符串条件查询

# 等于
df.query('C == "a"')# 不等于
df.query('C != "a"')# 包含在列表中
df.query('C in ["a", "b", "c"]')# 不包含在列表中
df.query('C not in ["a", "b"]')

高级用法

1. 使用变量 (@符号)

min_val = 3
max_val = 5df.query('A >= @min_val & A <= @max_val')

2. 列名包含空格或特殊字符

df = pd.DataFrame({'A value': [1, 2, 3], 'B@value': [4, 5, 6]})# 使用反引号包裹列名
df.query('`A value` > 1 & `B@value` < 6')

3. 使用 DataFrame 属性

# 查询索引
df.query('index > 2')# 查询列长度
df.query('A.str.len() > 1')  # 如果A是字符串列

4. 使用函数

# 使用内置函数
df.query('A.abs() > 2')  # 绝对值# 使用自定义函数
def my_func(x):return x * 2df.query('A > @my_func(2)')

性能考虑

  • 对于大型 DataFrame,query() 通常比布尔索引快,因为它在底层使用了 numexpr 库
  • 但对于小型 DataFrame,传统布尔索引可能更快

与传统布尔索引的比较

# 传统布尔索引
df[(df['A'] > 2) & (df['B'] < 50)]# query 方法
df.query('A > 2 & B < 50')

query() 的优势在于:

  1. 语法更简洁
  2. 不需要重复写 DataFrame 名称
  3. 对于复杂条件更易读

注意事项

  1. 表达式必须返回布尔值
  2. 列名中的特殊字符需要用反引号包裹
  3. 使用变量时需要用 @ 符号
  4. 表达式中的字符串需要用双引号包裹

实际应用示例

# 创建示例数据
data = {'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],'age': [25, 30, 35, 40, 45],'salary': [50000, 60000, 70000, 80000, 90000],'department': ['HR', 'IT', 'IT', 'Finance', 'HR']
}
df = pd.DataFrame(data)# 查询年龄在30-40之间且部门为IT或HR的员工
result = df.query('(age >= 30 & age <= 40) & department in ["IT", "HR"]')# 查询薪资高于平均薪资的员工
avg_salary = df['salary'].mean()
result = df.query('salary > @avg_salary')

query() 方法是 Pandas 中非常实用的功能,特别适合需要编写复杂筛选条件的场景,能够显著提高代码的可读性和简洁性。


例题

http://www.dtcms.com/a/316240.html

相关文章:

  • 涨薪技术|Kubernetes(k8s)之Pod生命周期(上)
  • Deveco Studio 3.1.0.501 Windows版下载安装教程 - 华为开发者工具安装步骤详解
  • BenchmarkDotNet 性能基准测试
  • 统计鱼儿分布情况 Java
  • 三种灰狼算法求解无人机三维路径规划【MATLAB实现】
  • 2025国赛数学建模C题详细思路模型代码获取,备战国赛算法解析——层次分析法
  • MATLAB实现菲涅尔法全息成像仿真
  • Groovy学习篇章一之—— GDK 探秘:Groovy如何给Java对象“开外挂”,让String也能“跑命令”!
  • 磁悬浮转子的“静音术”:深度解析无接触抑制旋转幽灵的奥秘
  • 基于MCP的智能客服系统:知识库与工单系统深度集成
  • 英语中日期与时间缩写
  • 针对软件定义车载网络的动态服务导向机制
  • CoRL-2025 | 北大“如影随形”具身导航智能体!TrackVLA:复杂自然环境中的具身视觉跟踪
  • cJSON库应用
  • Vulnhuntr:用于识别远程可利用漏洞的开源工具
  • 文字识别在媒资系统的技术原理及应用剖析
  • 数据安全治理——解读数据安全治理与评估服务业务介绍【附全文阅读】
  • Book Shop(Dynamic Programming)
  • Direct12第六章
  • 【LeetCode 热题 100】347. 前 K 个高频元素——(解法一)排序截取
  • 防火墙的区域划分和流量控制
  • Qwen3技术之模型预训练
  • Redis Stream:高性能消息队列核心原理揭秘
  • 数据结构04 栈和队列
  • tensorRT配合triton部署模型
  • C语言的结构体与联合体
  • LOOP Finance:一场 Web3 共和国中的金融制度实验
  • Spring Boot 与 Ollama 集成部署私有LLM服务 的完整避坑指南,涵盖 环境配置、模型管理、性能优化 和 安全加固
  • 【数据结构入门】数组和链表的OJ题(2)
  • uv与conda环境冲突,无法使用uv环境,安装包之后出现ModuleNotFoundError: No module named ‘xxx‘等解决方法