是否有任何函数等效于df.isin()和df[col].str.contains()的组合
例如,假设我有这个系列
s=pd.Series(['cat','hat','dog','fog','pet']),我想找到s包含任何['og','at']的所有地方,我想得到除“pet”之外的所有东西
我有一个解决方案,但它相当不雅观:
searchfor=['og','at']
found=[s.str.contains(x)代表searchfor中的x]
结果=pd.DataFrame[已找到]
结果:any()
有更好的方法吗
一种选择是只使用regex|字符来尝试匹配系列s中单词中的每个子字符串(仍然使用str.contains)
您可以通过将searchfor中的单词与|连接来构造正则表达式:
>&燃气轮机&燃气轮机;searchfor=['og','at']
&燃气轮机&燃气轮机&燃气轮机;s[s.str.contains('|'.join(searchfor))]
0猫
1顶帽子
2只狗
3雾
数据类型:对象
正如@AndyHayden在下面的评论中所指出的,如果子字符串中有一些特殊字符,如$和^,则要注意这些字符是否需要逐字匹配。这些字符在正则表达式的上下文中具有特定的含义,并将影响匹配
通过使用re.escape转义非字母数字字符,可以使子字符串列表更安全:
>&燃气轮机&燃气轮机;进口稀土
&燃气轮机&燃气轮机&燃气轮机;匹配项=['$money',x^y']
&燃气轮机&燃气轮机&燃气轮机;safe_matches=[对于匹配中的m,重新转义(m)]
&燃气轮机&燃气轮机&燃气轮机;安全火柴
[\\$money',x\\^y']
当与str.contains一起使用时,此新列表中带的字符串将与每个字符字面匹配