Python 通过在字符串列中查找精确的字(未组合)来过滤数据帧

Python 通过在字符串列中查找精确的字(未组合)来过滤数据帧,python,regex,string,pandas,dataframe,Python,Regex,String,Pandas,Dataframe,My DataFrame有两列: Name Status a I am Good b Goodness!!! c Good is what i feel d Not Good-at-all 我想筛选状态中以字符串“Good”作为确切单词的行,而不是与任何其他单词或字符组合的行 因此,输出将是: Name Status a i am Good c Good is what i feel 另外两行中有一个“Good”字符串,但与其他字符混合在一起,

My DataFrame有两列:

Name  Status
 a    I am Good
 b    Goodness!!!
 c    Good is what i feel
 d    Not Good-at-all
我想筛选状态中以字符串“Good”作为确切单词的行,而不是与任何其他单词或字符组合的行

因此,输出将是:

Name  Status
a    i am Good
c    Good is what i feel
另外两行中有一个“Good”字符串,但与其他字符混合在一起,因此不应拾取

我试着做:

d = df[df['Status'].str.contains('Good')]  # But all rows come up
我相信像
(r'\bGood\b',Status)
这样的正则表达式可以做到这一点,但这并不能把它总结起来。在数据帧过滤条件下,我如何/在何处准确地将正则表达式放入其中以实现这一点?以及如何使用或结束“Good”(精确单词搜索)?

如果您将“精确”定义为不表示其他字符(包括定义单词边界的标点符号
\b
),则可以改为检查前导和尾随空格和/或起始/结束锚定:

>>> df[df['Status'].str.contains(r'(?:\s|^)Good(?:\s|$)')]
  Name               Status
0    a            I am Good
2    c  Good is what i feel
说明:

  • (?:\s | ^)
    是查找空格字符(
    \s
    )或字符串开头(
    ^
    )的非捕获组

  • Good
    就是你要找的词

  • (?:\s |$)
    是一个非捕获组,用于查找空格字符(
    \s
    )或字符串结尾(
    $


如果您查看的是带有逗号的普通文本,那么在中添加逗号也很有用,如下所示

df[df['Status'].str.contains(r'(?:\s|^)Good(?:,\s|$)')]
基于类似的方法,您还可以动态构建查询,如下所示:

base = r'^{}'
expr = '(?:\s|^){}(?:,\s|$)'
string='Good'
df[df['Status'].str.contains(base.format(''.join(expr.format(string))))]

这在过滤数据帧时确实帮助了我。

@ajcr谢谢,我接受你的回答,但正如你确切提到的,我可以包含一些特殊字符,如?。。。因此,我很好奇如何允许一些/少数字符与“Good”组合,如“Good`s”或“Good!”。你能帮个忙吗?你可以创建一个字符类,其中的字符可以跟在“good”后面,例如
!?”。第二个字符类将是
“(?:[\s!?']|$)”
@AlexRiley您能帮我吗。我只想匹配行中的特定字符串。我有一个带字符串的列,我只想用正则表达式来计算这个精确的字符串?从上面的答案中,如果发现
良好,它将跳过。