Czy jest jakaś funkcja, która byłaby odpowiednikiem kombinacji df.isin()
i df[col].str.contains()
?
Na przykład, powiedzmy, że mam serię
s = pd.Series(['cat','hat','dog','fog','pet'])
i chcę znaleźć wszystkie miejsca, w których s
zawiera którekolwiek z ['og', 'at']
, chciałbym uzyskać wszystko oprócz „zwierzaka”.
Mam rozwiązanie, ale jest raczej nieeleganckie:
searchfor = ['og', 'at']
found = [s.str.contains(x) for x in searchfor]
result = pd.DataFrame[found]
result.any()
Czy jest lepszy sposób na zrobienie tego?
pd.Series.str.contains
. Jeśli problemem jest wydajność, warto to zbadać.Odpowiedzi:
Jedną z opcji jest po prostu użycie
|
znaku regex, aby spróbować dopasować każdy z podciągów w słowach w twojej seriis
(nadal używaszstr.contains
).Można skonstruować regex poprzez połączenie słów
searchfor
z|
:Jak @AndyHayden zauważył w komentarzach poniżej, uważaj, czy twoje podciągi mają znaki specjalne, takie jak
$
i,^
które chcesz dopasować dosłownie. Znaki te mają określone znaczenie w kontekście wyrażeń regularnych i będą miały wpływ na dopasowanie.Możesz zwiększyć bezpieczeństwo listy podciągów, poprzedzając znaki niealfanumeryczne za pomocą
re.escape
:Łańcuchy z na tej nowej liście będą dopasowywać każdy znak dosłownie, gdy są używane z
str.contains
.źródło
Możesz używać
str.contains
samodzielnie ze wzorcem wyrażenia regularnego, używającOR (|)
:Lub możesz dodać serię do, a
dataframe
następnie użyćstr.contains
:Wynik:
źródło
df.col.str.contains(r'(?=.*apple)(?=.*banana)',regex=True)
Oto jednowierszowa lambda, która również działa:
Wejście:
Zastosuj Lambda:
Wynik:
źródło