如何在 Polars 中像 SQL 一样使用 ‘in‘ 和 ‘not in‘ 进行数据筛选

欢迎来到 2026 年。在数据工程的飞速演进中,Python 的 Polars 库已经确立了自己作为基于 Rust 构建的高性能 DataFrame 库的地位,它不仅提供了卓越的 Python 接口,更具备了强大的数据处理能力。对于那些正在从 SQL 转型过来,或者需要进行复杂数据处理的朋友来说,Polars 提供了一套既熟悉又强大的工具,可以模拟甚至超越传统 SQL 的操作。在这篇文章中,我们将深入探讨如何在 Polars 中使用类似 SQL 的 INLINECODEcd8f2f27 和 INLINECODE37ef7037 操作来高效地筛选数据,并结合 2026 年最新的 AI 辅助开发理念(如 Vibe Coding)和云原生工程实践,分享我们在生产环境中的实战经验。

Python Polars 中的类 SQL 筛选

在 SQL 中,INLINECODE792dd592 和 INLINECODEe4487609 是用于根据多个可能的值来筛选记录的操作符。例如,选择某列值在指定列表内的记录。Polars 提供了类似的功能,允许我们根据列表内部或外部的值来筛选数据框,但它的底层实现利用了 Rust 的并行处理能力,速度远超传统方法。

前提条件

在开始之前,请确保您已经安装了 Polars。在 2026 年,我们强烈建议您使用最新的虚拟环境管理工具(如 uv)来极速安装依赖:

> uv pip install polars

同时,对 Python 和数据操作有基本的了解会很有帮助。如果你使用的是 Cursor 或 Windsurf 等 AI IDE,你可以直接让 AI 解释代码片段,这将大大加速你的学习曲线。

设置环境与 Vibe Coding 实践

在深入示例之前,让我们先聊聊“氛围编程”。在我们最近的团队项目中,我们发现让 AI 代理充当结对编程伙伴,可以极大提升代码质量。比如,我们可以让 AI 帮助我们生成模拟数据集,而不是手动编写。让我们创建一个数据框来演示筛选:

import polars as pl

# 这是一个我们将用来演示的基础数据框
# 在实际生产环境中,你可能需要处理数百万行数据
data = {
    "id": [1, 2, 3, 4, 5],
    "name": ["Alice", "Bob", "Charlie", "David", "Eve"],
    "role": ["Admin", "User", "User", "Admin", "Guest"],
    "salary": [120000, 85000, 90000, 115000, 60000]
}

df = pl.DataFrame(data)
print(df)

输出:

shape: (5, 4)
┌─────┬─────────┬───────┬────────┐
│ id  ┆ name    ┆ role  ┆ salary │
│ --- ┆ ---     ┆ ---   ┆ ---    │
│ i64 ┆ str     ┆ str   ┆ i64    │
╞═════╪═════════╪═══════╪════════╡
│ 1   ┆ Alice   ┆ Admin ┆ 120000 │
│ 2   ┆ Bob     ┆ User  ┆ 85000  │
│ 3   ┆ Charlie ┆ User  ┆ 90000  │
│ 4   ┆ David   ┆ Admin ┆ 115000 │
│ 5   ┆ Eve     ┆ Guest ┆ 60000  │
└─────┴─────────┴───────┴────────┘

深入探究:Python Polars 使用 ‘in‘ 和 ‘not in‘ 进行筛选

Polars 为筛选 DataFrame 行提供了非常直观的方法。要使用 INLINECODE6fa25705 和 INLINECODE3788707e 进行筛选,我们主要使用 INLINECODE3d0fec25 方法。对于 INLINECODE9ffde1f9,我们使用 ~ 运算符来进行取反。这比传统的 SQL 更灵活,因为它可以嵌套在复杂的表达式链中。

使用 .is_in() 方法 (模拟 ‘in‘)

让我们来看一个实际的例子,筛选特定角色的员工。

# 我们想要筛选出角色为 ‘Admin‘ 或 ‘User‘ 的员工
target_roles = ["Admin", "User"]

# 使用 .is_in() 方法
# 这里的 pl.col("role") 是一个表达式,它会在 Polars 的底层 Rust 引擎中高效运行
df_filtered = df.filter(pl.col("role").is_in(target_roles))

print("筛选 Admin 和 User:")
print(df_filtered)

使用 ‘not in’ 逻辑

你需要使用 INLINECODE8a5c7df5 运算符对 INLINECODEf39eee9c 进行取反,以筛选出具有特定列值的行进行排除。这在数据清洗中非常常见,例如排除测试账号。

# 我们想要排除 ‘Guest‘ 角色
excluded_role = ["Guest"]

# 使用 ~ 运算符进行取反
# 这实际上执行了 SQL 中的: WHERE role NOT IN (‘Guest‘)
df_active_users = df.filter(~pl.col("role").is_in(excluded_role))

print("排除 Guest 角色:")
print(df_active_users)

2026 工程化实战:处理生产级数据与性能优化

在实际的数据工程项目中,我们很少只处理几行数据。通常,我们需要从 S3 或 HDFS 加载海量数据。让我们看看如何处理大规模 CSV 数据,并探讨性能优化的策略。

大规模数据加载与筛选策略

假设我们有一个 large_data.csv 文件。在 2026 年,我们非常看重“惰性计算”和“流式处理”以节省内存资源。

import polars as pl

# 使用 scan_csv 而不是 read_csv
# scan_csv 是惰性的,它不会立即加载数据,直到我们调用 .collect()
# 这对于云原生环境下的超大文件至关重要,可以避免 OOM (内存溢出)
lf = pl.scan_csv("large_data.csv") 

# 假设我们需要筛选特定的城市列表
# 这种操作是“多线程”且“向量化”的,Polars 会自动利用 CPU 的所有核心
cities = ["New York", "Chicago", "San Francisco"]

# 构建筛选查询
df_filtered_large = lf.filter(
    pl.col("city").is_in(cities)
).collect() # 只有在这里才会真正执行计算

print(df_filtered_large)

常见陷阱与最佳实践

作为经验丰富的开发者,我们必须提醒你注意以下陷阱:

  • 数据类型不匹配: INLINECODE08586990 对类型敏感。如果列是 INLINECODE76ad584d 但列表包含整数,Polars 会抛出错误或者是返回空结果(取决于版本设置)。最佳实践:确保筛选列表的数据类型与列类型严格一致,或者在筛选前使用 .cast() 进行转换。
  • 空值处理: 在 SQL 中,INLINECODEd493ed7e 的处理非常棘手。在 Polars 中,如果列中存在 INLINECODE33e6640b,INLINECODE46f0bb17 默认不会匹配 INLINECODE2c6aa13c。如果你需要匹配 null,必须显式处理:
  •     # 同时匹配特定值和 null 值
        targets = ["Active", "Pending"]
        df.filter(pl.col("status").is_in(targets) | pl.col("status").is_null())
        
  • 海量筛选列表: 当你在 .is_in() 中使用一个包含数万个值的列表时,性能可能会下降。在 2026 年的版本中,Polars 已经对此进行了哈希优化,但在极端情况下,考虑将其进行 Join 操作可能更优。

高级场景:多条件组合

在实际业务逻辑中,我们经常需要组合多个条件。这展示了 Polars 表达式 API 的强大之处。

# 我们要找到:
# 1. 角色是 Admin 或 User
# 2. 且工资大于 80000
# 3. 并且 ID 不在离职名单中

active_roles = ["Admin", "User"]
resigned_ids = [999, 888] # 假设这些是已离职员工的 ID

df_complex = df.filter(
    (pl.col("role").is_in(active_roles)) & 
    (pl.col("salary") > 80000) &
    (~pl.col("id").is_in(resigned_ids))
)

print("复杂条件筛选结果:")
print(df_complex)

扩展示例与可观测性

让我们看一个更具体的例子,包括数据的清洗和调试技巧。在现代开发流程中,我们要确保代码不仅运行得快,还要易于维护。

示例:清洗电商订单数据

import polars as pl

# 模拟一份包含脏数据的订单报表
data_orders = {
    "order_id": [101, 102, 103, 104, 105, 106],
    "status": ["completed", "cancelled", "pending", "shipped", "completed", "unknown"],
    "amount": [100, 200, 50, 120, 300, 20]
}

df_orders = pl.DataFrame(data_orders)

# 场景:我们需要分析有效订单
# 有效订单状态列表
valid_statuses = ["completed", "shipped", "pending"]

# 排除那些由于系统错误产生的 ‘unknown‘ 状态
# 并只保留金额大于 0 的记录
analysis_df = df_orders.filter(
    pl.col("status").is_in(valid_statuses) & (pl.col("amount") > 0)
)

# 在生产代码中,我们会添加这一行来监控数据质量
# 这利用了 Polars 强强的聚合能力来进行数据概览
print("有效订单统计:")
print(analysis_df.group_by("status").agg(
    pl.col("amount").sum().alias("total_volume"),
    pl.len().alias("count")
))

结论与未来展望

Polars 让使用 INLINECODEf649d516 和 INLINECODE15420b44 条件筛选 DataFrame 行变得简单而高效。通过尝试不同的筛选标准,您可以更好地理解 Polars 的强大功能。回顾这篇文章,我们不仅掌握了基础的 .is_in() 用法,还深入到了生产级的数据处理策略。

在 2026 年的技术图景中,随着 AI Agent(智能代理)的普及,像 Polars 这样高性能、内存安全的库将成为构建 AI 原生数据应用的基础设施。当你配合 AI 辅助工具使用 Polars 时,你实际上是在释放“人类直觉 + 机器性能”的叠加势能。我们鼓励你在下一个项目中,尝试用 Polars 替代传统的工具,感受那种“飞”一般的处理速度。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/36156.html
点赞
0.00 平均评分 (0% 分数) - 0