当前位置: 首页 > 知识库问答 >
问题:

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

汪志业
2023-03-14

是否有任何函数可以等效于df.isin()df[coll]的组合。str.contains()

例如,假设我有一个系列s=pd.series(['cat','hat','dog','fog','pet']),我想找到s包含任何['og','at']的所有地方,我想得到除“pet”之外的所有东西。

我有一个解决办法,但它相当不优雅:

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

有更好的方法吗?

共有3个答案

宗政英才
2023-03-14

这里是一行lambda,也可以:

df["TrueFalse"] = df['col1'].apply(lambda x: 1 if any(i in x for i in searchfor) else 0)

输入:

searchfor = ['og', 'at']

df = pd.DataFrame([('cat', 1000.0), ('hat', 2000000.0), ('dog', 1000.0), ('fog', 330000.0),('pet', 330000.0)], columns=['col1', 'col2'])

   col1  col2
0   cat 1000.0
1   hat 2000000.0
2   dog 1000.0
3   fog 330000.0
4   pet 330000.0

应用Lambda:

df["TrueFalse"] = df['col1'].apply(lambda x: 1 if any(i in x for i in searchfor) else 0)

输出:

    col1    col2        TrueFalse
0   cat     1000.0      1
1   hat     2000000.0   1
2   dog     1000.0      1
3   fog     330000.0    1
4   pet     330000.0    0
尉迟默
2023-03-14

您可以使用str.contains单独使用正则表达式模式,使用OR(|)

s[s.str.contains('og|at')]

或者您可以将该系列添加到dataframe,然后使用str.contains

df = pd.DataFrame(s)
df[s.str.contains('og|at')] 

输出:

0 cat
1 hat
2 dog
3 fog 
柯耀
2023-03-14

一个选项是使用regex|字符来尝试匹配Seriess(仍然使用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一起使用时,这个新列表中的字符串将逐字匹配每个字符。

 类似资料:
  • 问题内容: 有没有这将是一个组合的等同的任何功能和? 例如,假设我有系列 ,并且我想找到s包含的任何一个的所有地方,那么我想得到除“宠物”以外的所有东西。 我有一个解决方案,但这很不雅致: 有一个更好的方法吗? 问题答案: 一种选择是仅使用正则表达式|字符尝试匹配系列中单词中的每个子字符串s(仍使用)。 你可以通过将单词与结合在一起来构造正则表达式|: 就像在下面的注释中指出的那样,请注意你的子字

  • 问题内容: 通常我希望有一种方法,但是似乎没有。 有什么合理的方法来检查? 问题答案: ECMAScript 6引入了: 但是不支持。在ECMAScript 5或更旧的环境中,使用,当找不到子字符串时,它将返回-1:

  • 通常我希望有方法,但似乎没有。 对此有什么合理的检查方法?

  • 问题内容: 如何检查字符串中是否包含字符列表,例如“ ABCDEFGH”,如何检查字符串中是否有字符列表。 问题答案: 在Java中使用正则表达式检查在Java中使用 正则表达式 例如:

  • 问题内容: 如何测试字符串以查看其是否包含数组中的任何字符串? 而不是使用 问题答案: 编辑:这是使用Java 8流API的更新。如此清洁。仍然可以与正则表达式结合使用。 另外,如果我们将输入类型更改为List而不是数组,则可以使用。 如果希望返回匹配的字符串,也可以使用。 原始的过时的答案: 这是(VERY BASIC)静态方法。请注意,在比较字符串上区分大小写。一个原始的,使其不区分大小写的办

  • 同 find() 方法类似,index() 方法也可以用于检索是否包含指定的字符串,不同之处在于,当指定的字符串不存在时,index() 方法会抛出异常。 index() 方法的语法格式如下: str.index(sub[,start[,end]]) 此格式中各参数的含义分别是: str:表示原字符串; sub:表示要检索的子字符串; start:表示检索开始的起始位置,如果不指定,默认从头开始检