通过在一列字符串中查找确切的单词(未组合)来过滤 DataFrame

Posted

技术标签:

【中文标题】通过在一列字符串中查找确切的单词(未组合)来过滤 DataFrame【英文标题】:Filtering DataFrame by finding exact word (not combined) in a column of strings 【发布时间】:2016-09-24 06:42:06 【问题描述】:

我的 DataFrame 有两列:

Name  Status
 a    I am Good
 b    Goodness!!!
 c    Good is what i feel
 d    Not Good-at-all

我想过滤 Status 包含字符串“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) 这样的正则表达式会做到这一点,但这无法将其总结在一起。以及如何/在哪里可以将正则表达式放入 DataFrame 过滤条件以实现此目的?以及如何实现startswithendswith'Good'(精确词搜索)?

【问题讨论】:

【参考方案1】:

如果您将“精确”定义为没有其他字符(包括定义单词边界 \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) 或字符串结尾 ($) 的非捕获组。

【讨论】:

@ajcr-谢谢,我接受你的回答,但正如你所提到的,我可以包含一些特殊的字符,比如! ?...所以我很好奇我将如何允许一些/几个字符与“Good”结合使用“Good`s”或“Good!”。你能帮忙吗? 您可以创建一个允许跟随“好”的字符的字符类,例如! ? '。第二个字符类将是"(?:[\s!?']|$)" @AlexRiley 你能帮帮我吗?我只想匹配行中的特定字符串。我有带字符串的列,我只想用正则表达式计算那个确切的字符串?如果找到good.,则从上面的答案中跳过【参考方案2】:

如果您正在查看带有逗号的普通文本,则添加逗号也很有用,如下所示。

df[df['Status'].str.contains(r'(?:\s|^)Good(?:,\s|$)')]

【讨论】:

【参考方案3】:

基于类似的question/answer,您还可以动态构建查询,如下所示:

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

这对我过滤数据框很有帮助。

【讨论】:

以上是关于通过在一列字符串中查找确切的单词(未组合)来过滤 DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

高手来,excel在一组数组中查找值,并返回对应的某一列的值,怎么实现

如何根据分组将字符串组合在一列中

PANDAS 从列中找到确切的给定字符串/单词

在 Pandas 中处理 Nulls – 在一列中使用过滤值来填充另外两列中的 nan

sql 在集合中查找(多个值在一列中像字符串一样存在)

高手来!excel在一组数组中查找值,并返回对应的某一列的值,怎么实现?