Pandas query() 方法详解

Pandas query() 方法详解

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

基本语法

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

基本用法

1. 简单条件查询

python 复制代码
import pandas as pd

df = 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. 多条件查询

python 复制代码
# AND 条件
df.query('A > 2 & B < 50')

# OR 条件
df.query('A > 4 | B == 20')

# 使用括号明确优先级
df.query('(A > 2) & (B < 50)')

3. 字符串条件查询

python 复制代码
# 等于
df.query('C == "a"')

# 不等于
df.query('C != "a"')

# 包含在列表中
df.query('C in ["a", "b", "c"]')

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

高级用法

1. 使用变量 (@符号)

python 复制代码
min_val = 3
max_val = 5

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

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

python 复制代码
df = pd.DataFrame({'A value': [1, 2, 3], 'B@value': [4, 5, 6]})

# 使用反引号包裹列名
df.query('`A value` > 1 & `B@value` < 6')

3. 使用 DataFrame 属性

python 复制代码
# 查询索引
df.query('index > 2')

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

4. 使用函数

python 复制代码
# 使用内置函数
df.query('A.abs() > 2')  # 绝对值

# 使用自定义函数
def my_func(x):
    return x * 2

df.query('A > @my_func(2)')

性能考虑

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

与传统布尔索引的比较

python 复制代码
# 传统布尔索引
df[(df['A'] > 2) & (df['B'] < 50)]

# query 方法
df.query('A > 2 & B < 50')

query() 的优势在于:

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

注意事项

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

实际应用示例

python 复制代码
# 创建示例数据
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 中非常实用的功能,特别适合需要编写复杂筛选条件的场景,能够显著提高代码的可读性和简洁性。


例题

相关推荐
百年੭ ᐕ)੭*⁾⁾16 小时前
DataFrame存入mysql以及读取操作
数据库·mysql·numpy·pandas·ipython
李昊哲小课1 天前
国际足球比赛数据集分析报告(1872-2025)
信息可视化·数据挖掘·数据分析·pandas·matplotlib·pyecharts·seaborn
howard20052 天前
Pandas加载Avro文件
pandas·avro
懒羊羊不懒@3 天前
Pandas库详细介绍
pandas
一晌小贪欢3 天前
PyQt5 + Pandas 打造常见的表格(Excel/CSV)读取与处理工具
python·qt·excel·pandas·python办公·excel处理
阿钱真强道4 天前
11 数据预处理-数据集成与重复数据处理
pandas·数据清洗·数据集成·merge·数据合并·重复数据处理·drop_duplicates
阿钱真强道4 天前
08 Python 数据分析:学生画像匹配与相似度计算
python·机器学习·数据分析·pandas·推荐系统·相似度计算·文本分析
阿钱真强道4 天前
06 Python 数据分析入门:集中趋势与离散程度
python·数据挖掘·数据分析·pandas·可视化·python入门·统计学
XDHCOM4 天前
Pandas怎么连接外部数据库导入数据,步骤和注意点简单讲讲
数据库·pandas
howard20054 天前
Pandas读取包含多个工作表的Excel文件
excel·pandas