通过在一列字符串中查找确切的单词(未组合)来过滤 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 过滤条件以实现此目的?以及如何实现startswith
或endswith
'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在一组数组中查找值,并返回对应的某一列的值,怎么实现