数据帧过滤:在 Pandas 查询中使用正则表达式

2023-10-15

The 查询()方法Pandas 中允许您根据查询表达式过滤 DataFrame 行。

将正则表达式 (regex) 的强大功能与query()方法允许更高级和灵活的查询。

本教程将指导您完成使用正则表达式的过程query()熊猫中的方法。

 

 

匹配字符串的开头或结尾

您可以使用以下字符来匹配字符串的开头或结尾:

  1. ^: 代表字符串的开头。
  2. $: 表示字符串的结束。

匹配开头

首先,让我们创建一个示例 DataFrame:


import pandas as pd
data = {
    'item_name': ['apple', 'banana', 'cherry', 'pineapple', 'apple pie', 'banana split']
}
df = pd.DataFrame(data)  

让我们发现以子字符串“apple”开头的项目。


start_with_apple = df.query("item_name.str.contains('^apple')")
print(start_with_apple)
  

Output:


   item_name
0      apple
4  apple pie
  

在这里,图案^apple使用,确保仅选择那些以“apple”开头的项目。

匹配结尾

现在,要识别以“apple”结尾的项目。


end_with_apple = df.query("item_name.str.contains('apple$')")
print(end_with_apple)
  

Output:


   item_name
0      apple
3  pineapple
  

这确保提取以“apple”结尾的项目。

 

基本正则表达式模式

正则表达式带有基本模式和元字符,可以增强您的文本匹配任务:

  1. . (Dot):匹配除换行符之外的任何单个字符。
  2. *(星号):匹配前面的字符或组的零次或多次重复。

让我们来说明一下这些模式。


# Query to find item names that contain exactly five characters
five_chars = df.query("item_name.str.contains('^.....$')")
print(five_chars)
  

Output:


  item_name
0     apple
  

在这个查询中,.....匹配字符串中任意位置包含五个字符的任何项目名称。

对于我们的下一个示例,让我们识别包含后跟“apple”的任何字符集的项目。


pattern_start = df.query("item_name.str.contains('.*apple')")
print(pattern_start)
  

Output:


   item_name
0      apple
3  pineapple
4  apple pie
  

The .*翻译为“零个或多个任何字符”。

 

字符类别和范围

使用方括号描述字符类[]。例如,[abc]将匹配“a”、“b”或“c”中的任何单个字符。

让我们识别包含字母“a”或“p”,后跟字母“i”的项目。


char_class_query = df.query("item_name.str.contains('[ap]i')")
print(char_class_query)
  

Output:


   item_name
3  pineapple
4  apple pie
  

在此查询中,模式[ap]i捕获名称中包含“ai”或“pi”的项目。

Ranges

范围是字符类的子集。您可以使用连字符指定范围,而不是列出单个字符。例如,[a-c]将匹配任何单个字符“a”、“b”或“c”。

为了说明这一点,让我们提取名称中包含“a”和“c”之间的任何小写字母并后跟字母“e”的项目。


range_query = df.query("item_name.str.contains('[a-h]e')")
print(range_query)
  

Output:


  item_name
2    cherry
  

图案[a-h]e匹配包含“ae”、“be”、“ce”、“de”、“ee”、“fe”、“ge”和“he”等子字符串的项目。

 

根据某些模式排除行

结合使用字符类^字符(方括号内)使您能够否定特定字符。

例如,如果您希望排除包含字母“a”或“p”的项目:


exclude_chars = df.query("not item_name.str.contains('[ap]')")
print(exclude_chars)
  

Output:


  item_name
2    cherry
  

图案not item_name.str.contains('[ap]')确保包含字母“a”或“p”的行从结果中排除。

排除特定模式

要根据特定模式排除行,请使用not关键字与您的正则表达式模式一起在query() method.

假设您要排除以“apple”结尾的项目:


exclude_pattern = df.query("not item_name.str.contains('apple$')")
print(exclude_pattern)
  

Output:


      item_name
1        banana
2        cherry
4     apple pie
5  banana split
  

 

忽略正则表达式查询中的大小写敏感性

默认情况下,搜索将区分小写和大写字符。

要执行不区分大小写的搜索,可以使用 case 参数。

以下是如何以不区分大小写的方式搜索“apple”:


import re
case_insensitive_search = df.query('item_name.str.contains("APPLE", case=False)')
print(case_insensitive_search)
  

Output:


   item_name
0      apple
3  pineapple
4  apple pie
  

使用上面的代码,搜索将匹配“apple”和“pineapple”(以及任何其他包含“apple”的字符串,无论大小写)。

 

正向和负向前瞻/后瞻

正向先行断言字符串中当前位置之后的内容,但不消耗任何字符。语法是(?=...).

查找后跟空格的文本

例如,要查找“apple”后跟一个空格的项目:


positive_lookahead_query = df.query("item_name.str.contains('apple(?= )')")
print(positive_lookahead_query)
  

Output:


   item_name
4  apple pie
  

仅当模式“apple(?= )”后面直接跟有空格时,才与术语“apple”匹配。

查找后面没有空格的文本

语法是(?!...).

要查找带有“apple”且后面没有空格的项目:


negative_lookahead_query = df.query("item_name.str.contains('apple(?! )')")
print(negative_lookahead_query)
  

Output:


   item_name
0      apple
3  pineapple
  

查找前面有空格的文本

正向回顾断言字符串中当前位置之前的内容,但同样不会消耗字符。语法是(?<=...).

要查找“pie”一词前面有空格的项目:


positive_lookbehind_query = df.query("item_name.str.contains('(?<= )pie')")
print(positive_lookbehind_query)
  

Output:


   item_name
4  apple pie
  

仅当模式“(?

查找前面没有空格的文本

负向后查找断言某个字符串不直接位于当前位置之前。语法是(?<!...).

要查找“pie”前面没有空格的项目:


negative_lookbehind_query = df.query("item_name.str.contains('(?<! )pi')")
print(negative_lookbehind_query)
  

Output:


   item_name
3  pineapple
  

在这种情况下,只有“pineapple”包含术语“pi”,前面没有空格。

 

基于具有特殊字符的模式进行过滤

匹配特殊字符,例如$.^*+?{}[]\()|,您必须使用反斜杠“转义”它们\.

例如,如果您想查找带有美元符号的项目$:


import pandas as pd
data = {
    'item_name': ['$apple', 'banana', 'cherry', 'pineapple', 'apple pie', 'banana split']
}
df = pd.DataFrame(data)
special_char_query = df.query("item_name.str.contains('\\$')")
print(special_char_query)
  

Output:


  item_name
0    $apple
  

在这里,图案\\$确保美元符号被视为文字字符,而不是代表字符串结尾的正则表达式元字符。

 

分组和捕获

正则表达式中的组是使用括号创建的(...)。它们不仅将模式的元素组合在一起,而且还捕获与该组匹配的内容。

例如,要识别以“apple”开头,后跟任意字符序列的项目:


grouping_query = df.query("item_name.str.contains('^(apple)(.+)$')")
print(grouping_query)
  

Output:


   item_name
4  apple pie
  

Here, ^(apple)(.+)$有两组:(apple) and (.+)。第一组捕获“apple”一词,第二组捕获任何一个或多个字符。

从组中捕获内容

要提取特定的捕获内容,您通常会使用str.extract() method:


captured_content = df['item_name'].str.extract('^(apple)(.*)$')
print(captured_content)
  

Output:


       0     1
0  apple      
1    NaN   NaN
2    NaN   NaN
3    NaN   NaN
4  apple   pie
5    NaN   NaN
  

数据框captured_content有两列,每列代表正则表达式模式中的一个捕获组。

具有匹配项的行显示捕获的内容,而其他行则显示 NaN。

非捕获组

在某些情况下,您希望对元素进行分组而不捕获匹配的内容。

这可以使用语法来完成(?:...).

例如,将“苹果”或“香蕉”分组但不捕获:


non_capturing_group_query = df.query("item_name.str.contains('^(?:apple|banana)')")
print(non_capturing_group_query)
  

Output:


      item_name
0        apple
1       banana
4     apple pie
5  banana split
  

图案^(?:apple|banana)将“苹果”和“香蕉”分组进行交替,但不捕获他们的比赛。

 

反向引用

反向引用表示为\n where n是与您所引用的捕获组对应的编号。例如,\1指的是第一个捕获组。

为了进行演示,让我们查找具有重复单词的项目,例如“apple apple”:


import pandas as pd
data = {
    'item_name': ['apple apple', 'banana', 'cherry', 'pineapple', 'apple pie', 'banana split']
}
df = pd.DataFrame(data)
backreference_query = df.query(r"item_name.str.contains('^(\\w+) \\1$')")
print(backreference_query)
  

Output:


    item_name
0  apple apple
  

在图案中^(\\w+) \\1$,第一组(\\w+)捕获单词字符序列。

反向引用\\1then 引用该组匹配的内容,确保相同的序列再次出现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据帧过滤:在 Pandas 查询中使用正则表达式 的相关文章

随机推荐

  • 第 44 集:为 PyCascades 2021 创建交互式在线 Python 会议

    第 44 集 为 PyCascades 2021 创建交互式在线 Python 会议 真正的 Python 播客 2021 年 1 月 22 日1小时4分钟 RSS Apple Podcasts Google Podcasts Spotif
  • 测试您的 Python 应用程序

    测试您的 Python 应用程序 学习路径 技能 测试 Python 代码 PyTest Mocking 没有一个开发人员是完美的 我们都会犯错误 如果不加以控制 其中一些错误可能会导致故障或错误 而恢复成本可能非常昂贵 测试您的代码有助于
  • 学习 Python 编程的 11 个初学者技巧

    目录 Make It Stick 提示 1 每天编码 技巧 2 写下来 提示 3 互动 秘诀 4 休息一下 提示 5 成为 Bug 赏金猎人 Make It Collaborative 提示 6 让自己周围都是正在学习的人 秘诀 7 教学
  • Python 对象的浅复制与深复制

    目录 制作浅副本 制作深层副本 复制任意Python对象 3 件事要记住 Python 中的赋值语句不会创建副本对于对象 它们仅将名称绑定到对象 为了不可变的对象 通常没有什么区别 但对于与可变的对象或可变对象的集合 您可能正在寻找一种方法
  • Pythonic 壁纸包

    通过以下方式表达您对 Python 的热爱 The Pythonic Wallpapers Pack 原价 9 99 美元 今日仅需 4 99 美元 使用这些为您的计算机 手机或平板电脑定制的独特壁纸 向世界展示您是 Python 达人 你
  • 理解 Python print() 函数:超越 Hello World

    您可能想知道 为什么要写一个关于简单打印功能的完整教程 但不要被欺骗 谦卑者print 函数虽然使用简单 但却是 Python 工具库中不可或缺的工具 本教程将引导您了解使用print 函数 探索其语法和参数 然后深入研究更高级的主题 您将
  • 在 Python 中删除字符串中标点符号的 5 种方法

    Python 提供了多种删除标点符号的方法 这里的目标是将字符串中的每个标点字符替换为空字符串 让我们为所有示例考虑以下原始字符串 original string Hello World Let s test some punctuatio
  • PyQt5 教程 – Python GUI 编程示例

    PyQt5 是用 Python 构建 GUI 应用程序时最常用的模块之一 这是因为它的简单性 正如您将看到的那样 鼓励开发人员使用 PyQt5 的另一个重要功能是 PyQt5 设计器 它使得在短时间内开发复杂的 GUI 应用程序变得非常容易
  • Python GUI 示例(Tkinter 教程)

    在本教程中 我们将通过使用 Tkinter 包编写一些 Python GUI 示例来学习如何开发图形用户界面 Tkinter 包作为标准包随 Python 一起提供 因此我们不需要安装任何东西即可使用它 Tkinter 包是一个非常强大的包
  • Python 中的凯撒密码(文本加密教程)

    密码学涉及将一条信息 以纯文本形式 加密或编码为一种看起来乱码且在普通语言中毫无意义的形式 此编码消息 也称为密文然后 目标接收者可以使用传达给最终用户的解码技术 通常与私钥一起 将其解码回纯文本 凯撒密码是我们将在本教程中重点介绍的最古老
  • 安装和使用非 Composer Laravel 包

    如果你想在 Laravel 中使用包 你只需在 Composer json 文件中添加一行即可完成工作 这是因为该包在 packagist org 中可用 如果您要使用的包是非 Composer Laravel 包怎么办 可能在 git 存
  • 文本处理中 Awk 命令的 30 个示例

    在上一篇文章中 我们谈到了sed命令我们看到了许多在文本处理中使用它的例子 我们看到了它在这方面的优点 但它有一些局限性 有时您需要一些强大的功能 让您能够更好地控制数据处理 这是哪里awk 命令进来 awk 命令或具体的 GNU awk
  • 安装、保护、访问和配置 Linux 邮件服务器 (Postfix)

    如果您想发送或接收电子邮件 您应该有一个邮件服务器 在这篇文章中 我们将讨论 Linux 邮件服务器以及 SMTP 简单邮件传输协议 以及其他邮件相关协议 例如邮局协议 POP 和互联网消息访问协议 IMAP 的工作原理以及它们之间的关系他
  • 了解和使用 Linux Subshel​​l(实用指南)

    子shell是由shell启动的子进程 shell本质上是一个命令行解释器 它共享父 shell 的属性 但在单独的进程空间中运行 子 shell 为执行命令和运行脚本提供了隔离性和灵活性 子 shell 通常用于任务自动化 并行执行和模块
  • 加速您的 Python 代码:Numba 实用指南

    Numba 是一个开源 JIT 编译器 可以翻译以下代码的子集Python and NumPy代码转换为快速机器代码 它通过使用行业标准的 LLVM 编译器库并优化执行速度来加速数值计算 在本教程中 我们将探索如何使用 Numba 使 Py
  • Linux 正则表达式教程(Sed 和 AWK)示例

    为了成功地与Linux sed编辑和awk 命令在 shell 脚本中 您必须了解正则表达式或简称正则表达式 由于正则表达式有很多引擎 我们将使用 shell 正则表达式并了解 bash 在使用正则表达式方面的强大功能 首先 我们需要了解什
  • 10 多个在 Linux 中终止进程的示例

    在本教程中 我们将通过多个示例讨论如何终止 Linux 中的进程 在大多数情况下 就像输入 kill 命令然后输入进程 ID 通常缩写为 PID 一样简单 正如你所看到的 我们杀死了一个ID为1813的进程 如果您是 Windows 用户
  • 如何安装和配置 Squid Linux 代理服务器

    Linux代理服务器或代理服务器通常是保存访问过的网页以供以后请求的服务器 因此如果您尝试访问同一个网页或其他任何人 您将从代理服务器获取页面 这非常有用 它使网上冲浪速度更快并减少流量 这意味着成本更低 缓存服务器可以将外部流量减少至 4
  • 使用 Sed 命令进行文本替换的实际示例

    在本教程中 您将深入研究如何使用实际示例sed命令可用于文本替换 在本教程结束时 您将对以下方面有更深入的了解sed及其在文本替换中的实际应用 目录 hide 1 将 URL 中的 HTTP 更改为 HTTPS 2 用下划线替换空格 3 更
  • 数据帧过滤:在 Pandas 查询中使用正则表达式

    The 查询 方法Pandas 中允许您根据查询表达式过滤 DataFrame 行 将正则表达式 regex 的强大功能与query 方法允许更高级和灵活的查询 本教程将指导您完成使用正则表达式的过程query 熊猫中的方法 目录 hide