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

时间:2016-05-26 10:11:47

标签: python regex string pandas dataframe

我的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'良好'(确切的单词搜索)?

3 个答案:

答案 0 :(得分:5)

如果您将“exact”定义为没有其他字符(包括定义字边界\b的标点符号),则可以检查前导和尾随空格和/或开始/结束锚点:< / p>

>>> 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)或字符串的结尾($)。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

这在过滤数据帧时对我很有帮助。