Existe alguma função que seria equivalente a uma combinação de df.isin()
e df[col].str.contains()
?
Por exemplo, digamos que eu tenha a série
s = pd.Series(['cat','hat','dog','fog','pet'])
e desejo encontrar todos os lugares onde s
contenha qualquer um de ['og', 'at']
, gostaria de obter tudo, exceto 'animal de estimação'.
Eu tenho uma solução, mas é bastante deselegante:
searchfor = ['og', 'at']
found = [s.str.contains(x) for x in searchfor]
result = pd.DataFrame[found]
result.any()
Existe uma maneira melhor de fazer isso?
pd.Series.str.contains
. Se o desempenho for um problema, vale a pena investigar isso.Respostas:
Uma opção é apenas usar o
|
caractere regex para tentar corresponder cada uma das substrings nas palavras em sua séries
(ainda usandostr.contains
).Você pode construir a regex juntando as palavras
searchfor
com|
:Como @AndyHayden observou nos comentários abaixo, tome cuidado se suas substrings tiverem caracteres especiais como
$
e^
que você deseja corresponder literalmente. Esses caracteres têm significados específicos no contexto de expressões regulares e afetarão a correspondência.Você pode tornar sua lista de substrings mais segura escapando caracteres não alfanuméricos com
re.escape
:As strings com nesta nova lista corresponderão literalmente a cada caractere quando usadas com
str.contains
.fonte
Você pode usar
str.contains
sozinho com um padrão regex usandoOR (|)
:Ou você pode adicionar a série a um
dataframe
e usarstr.contains
:Resultado:
fonte
df.col.str.contains(r'(?=.*apple)(?=.*banana)',regex=True)
Aqui está um lambda de uma linha que também funciona:
Entrada:
Aplique Lambda:
Resultado:
fonte