我的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
'良好'(确切的单词搜索)?
答案 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))))]
这在过滤数据帧时对我很有帮助。