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

发布于 2021-02-02 23:14:38

有没有这将是一个组合的等同的任何功能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()

有一个更好的方法吗?

关注者
0
被浏览
73
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    一种选择是仅使用正则表达式|字符尝试匹配系列中单词中的每个子字符串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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看