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

新手上路,请多包涵

是否有任何功能相当于 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()

有一个更好的方法吗?

原文由 ari 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 260
2 个回答

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

原文由 Alex Riley 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 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

原文由 l‘L’l 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题