是否有任何功能相当于 和 的df.isin()组合df[col].str.contains()?
df.isin()
df[col].str.contains()
例如,假设我有 series ,并且我想找到包含任何 的s = pd.Series(['cat','hat','dog','fog','pet'])所有地方,我想获得除“pet”之外的所有内容。s``['og', 'at']
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)。
|
s
str.contains
您可以通过将单词加入searchforwith来构造正则表达式|:
searchfor
>>> searchfor = ['og', 'at'] >>> s[s.str.contains('|'.join(searchfor))] 0 cat 1 hat 2 dog 3 fog dtype: object
正如@AndyHayden 在下面的评论中指出的那样,请注意您的子字符串是否包含特殊字符,例如您想要逐字匹配的$和。^这些字符在正则表达式的上下文中具有特定的含义,会影响匹配。
$
^
您可以通过转义非字母数字字符来使您的子字符串列表更安全re.escape:
re.escape
>>> import re >>> matches = ['$money', 'x^y'] >>> safe_matches = [re.escape(m) for m in matches] >>> safe_matches ['\\$money', 'x\\^y']
与 一起使用时,此新列表中的字符串将按字面意思匹配每个字符str.contains。