小编典典

如何在熊猫中测试字符串是否包含列表中的子字符串之一?

all

是否有任何功能相当于 和 的df.isin()组合df[col].str.contains()

例如,假设我有 series ,并且我想找到包含任何 的s = pd.Series(['cat','hat','dog','fog','pet'])所有地方,我想获得除“pet”之外的所有内容。s``['og', 'at']

我有一个解决方案,但它相当不雅:

searchfor = ['og', 'at']
found = [s.str.contains(x) for x in searchfor]
result = pd.DataFrame[found]
result.any()

有一个更好的方法吗?


阅读 99

收藏
2022-06-30

共1个答案

小编典典

一种选择是仅使用正则表达式|字符来尝试匹配系列中单词中的每个子字符串s(仍在使用str.contains)。

您可以通过将单词加入searchforwith来构造正则表达式|

>>> 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

2022-06-30