有没有这将是一个组合的等同的任何功能df.isin()
和df[col].str.contains()
?
例如,假设我有系列
s = pd.Series(['cat','hat','dog','fog','pet'])
,并且我想找到s
包含的任何一个的所有地方['og', 'at']
,那么我想得到除“宠物”以外的所有东西。
我有一个解决方案,但这很不雅致:
searchfor = ['og', 'at']
found = [s.str.contains(x) for x in searchfor]
result = pd.DataFrame[found]
result.any()
有一个更好的方法吗?
一种选择是仅使用正则表达式|
字符尝试匹配系列中单词中的每个子字符串s
(仍使用str.contains
)。
你可以通过将单词searchfor
与结合在一起来构造正则表达式|
:
>>> searchfor = ['og', 'at']
>>> s[s.str.contains('|'.join(searchfor))]
0 cat
1 hat
2 dog
3 fog
dtype: object
就像@AndyHayden在下面的注释中指出的那样,请注意你的子字符串是否具有特殊字符,例如$
和^
你想在字面上进行匹配的字符。这些字符在正则表达式的上下文中具有特定含义,并且会影响匹配。
你可以通过转义非字母数字字符来使子字符串列表更安全re.escape
:
>>> import re
>>> matches = ['$money', 'x^y']
>>> safe_matches = [re.escape(m) for m in matches]
>>> safe_matches
['\\$money', 'x\\^y']
与结合使用时,此新列表中带有的字符串将逐字匹配每个字符str.contains
。
添加此链接pandas.pydata.org/pandas-docs/stable / ...也可能很好。从pandas 0.15开始,字符串操作更加容易
您必须注意的一件事是,searchfor中的字符串是否具有特殊的正则表达式字符(您可以使用re.escape进行映射)。
@AndyHayden谢谢,我已经改进了答案,以考虑到这种复杂性。
我不知道为什么您的方法不适用于“ str.startswith('|'.join(searchfor))”
在这种情况下,我知道我们使用“ |” 对于OR,我们如何使用AND?