【问题标题】:Pandas how to filter for multiple substrings in series熊猫如何过滤串联的多个子字符串
【发布时间】:2021-09-21 21:47:42
【问题描述】:

我想检查 pandas 数据框列 id 是否包含以下子字符串 '.F1', '.N1', '.FW', '.SP'

我目前正在使用以下代码:

searchfor = ['.F1', '.N1', '.FW', '.SP']
mask = (df["id"].str.contains('|'.join(searchfor)))

id 列如下所示:

                   ID
0  F611B4E369F1D293B5
1  10302389527F190F1A

我实际上是在查看id 列是否包含以. 开头的四个子字符串。由于某些原因,F1 将被过滤掉。在当前示例中,它没有.F1。如果有人能让我知道如何解决这个特定问题,我将不胜感激。非常感谢。

【问题讨论】:

  • . 匹配任何内容。所以表达式.F1 可以是后面跟F1 的任何东西。两个字符串都有这种模式。索引 0 中的 9F1 和索引 1 中的 7F10F1。还不清楚您是如何使用掩码的,因为它应该与显示的两个 ID 匹配。
  • 您可以使用'\.F1're.escape() 转义
  • df["ID"].str.contains('\\'+'|\\'.join(searchfor))
  • @AndrejKesely 非常感谢您的建议。只是为了确认它会在第一行用“\.F1”转义对吗?
  • @SkipperLin 试试这个searchfor = ['\.F1', '\.N1', '\.FW', '\.SP']

标签: python pandas string dataframe


【解决方案1】:

您可以使用re.escape()通过以下方式转义正则表达式元字符,这样您就不需要转义单词列表中的每个字符串searchfor (无需更改@的定义987654325@):

import re

searchfor = ['.F1', '.N1', '.FW', '.SP']            # no need to escape each string

pattern = '|'.join(map(re.escape, searchfor))       # use re.escape() with map()

mask = (df["id"].str.contains(pattern))

re.escape() 将为您转义每个字符串:

print(pattern)

'\\.F1|\\.N1|\\.FW|\\.SP'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2015-09-24
    • 2019-08-22
    • 2018-07-10
    • 2014-10-03
    • 2014-04-05
    • 2018-11-23
    相关资源
    最近更新 更多