Есть ли какая-нибудь функция, которая была бы эквивалентом комбинации 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) for x in searchfor]
result = pd.DataFrame[found]
result.any()
Есть лучший способ сделать это?
pd.Series.str.contains
. Если производительность является проблемой, возможно, стоит изучить это.Ответы:
Один из вариантов - просто использовать
|
символ регулярного выражения, чтобы попытаться сопоставить каждую из подстрок в словах в вашей серииs
(все еще использующиесяstr.contains
).Вы можете создать регулярное выражение, объединив слова
searchfor
с помощью|
:Как отметил @AndyHayden в комментариях ниже, будьте осторожны, если в ваших подстроках есть специальные символы, такие как
$
и,^
которые вы хотите сопоставить буквально. Эти символы имеют определенные значения в контексте регулярных выражений и влияют на сопоставление.Вы можете сделать свой список подстрок более безопасным, избегая не буквенно-цифровых символов с помощью
re.escape
:Строки с в этом новом списке будут соответствовать каждому символу буквально при использовании с
str.contains
.источник
Вы можете использовать
str.contains
только с шаблоном регулярного выражения, используяOR (|)
:Или вы могли бы добавить серию к
dataframe
затем использоватьstr.contains
:Вывод:
источник
df.col.str.contains(r'(?=.*apple)(?=.*banana)',regex=True)
Вот однострочная лямбда, которая также работает:
Входные данные:
Применить лямбда:
Вывод:
источник