Y a-t-il une fonction qui équivaudrait à une combinaison de df.isin()
et df[col].str.contains()
?
Par exemple, disons que j'ai la série
s = pd.Series(['cat','hat','dog','fog','pet'])
et que je veux trouver tous les endroits où s
contient l'un des ['og', 'at']
, je voudrais tout obtenir sauf «animal de compagnie».
J'ai une solution, mais c'est plutôt inélégant:
searchfor = ['og', 'at']
found = [s.str.contains(x) for x in searchfor]
result = pd.DataFrame[found]
result.any()
Y a-t-il une meilleure manière de faire cela?
pd.Series.str.contains
. Si les performances sont un problème, cela peut valoir la peine d'être étudié.Réponses:
Une option consiste simplement à utiliser le
|
caractère regex pour essayer de faire correspondre chacune des sous-chaînes dans les mots de votre séries
(toujours en utilisantstr.contains
).Vous pouvez construire l'expression régulière en joignant les mots
searchfor
avec|
:Comme @AndyHayden l'a noté dans les commentaires ci-dessous, faites attention si vos sous-chaînes ont des caractères spéciaux tels que
$
et^
que vous voulez faire correspondre littéralement. Ces caractères ont des significations spécifiques dans le contexte des expressions régulières et affecteront la correspondance.Vous pouvez rendre votre liste de sous-chaînes plus sûre en échappant les caractères non alphanumériques avec
re.escape
:Les chaînes avec dans cette nouvelle liste correspondront littéralement à chaque caractère lorsqu'elles sont utilisées avec
str.contains
.la source
Vous pouvez utiliser
str.contains
seul avec un modèle regex en utilisantOR (|)
:Ou vous pouvez ajouter la série à un
dataframe
puis utiliserstr.contains
:Production:
la source
df.col.str.contains(r'(?=.*apple)(?=.*banana)',regex=True)
Voici un lambda d'une ligne qui fonctionne également:
Contribution:
Appliquer Lambda:
Production:
la source