Maison > développement back-end > Tutoriel Python > Comment puis-je filtrer efficacement une série Pandas pour plusieurs sous-chaînes ?

Comment puis-je filtrer efficacement une série Pandas pour plusieurs sous-chaînes ?

Linda Hamilton
Libérer: 2024-11-23 18:17:20
original
341 Les gens l'ont consulté

How Can I Efficiently Filter a Pandas Series for Multiple Substrings?

Filtrage Pandas efficace pour plusieurs sous-chaînes dans une série

Déterminer si une série contient l'une des plusieurs sous-chaînes est une tâche courante dans l'analyse des données. Bien que l'utilisation d'opérations logiques ou la combinaison d'opérations str.contains individuelles offre une solution simple, elle peut s'avérer inefficace pour les longues listes de sous-chaînes et les grandes trames de données.

Pour optimiser cette tâche, envisagez d'adopter une approche d'expression régulière (regex). En encapsulant les sous-chaînes dans un modèle regex, nous pouvons exploiter les fonctions efficaces de correspondance de chaînes des pandas. Plus précisément, après avoir échappé les caractères spéciaux dans les sous-chaînes, nous pouvons construire un modèle d'expression régulière en joignant les sous-chaînes à l'aide du caractère barre verticale (|) :

import re

esc_lst = [re.escape(s) for s in lst]
pattern = '|'.join(esc_lst)
Copier après la connexion

Avec ce modèle, nous pouvons filtrer la série à l'aide de str. contient et une correspondance insensible à la casse :

df[col].str.contains(pattern, case=False)
Copier après la connexion

Cette approche offre des performances améliorées, en particulier pour les trames de données volumineuses. Prenons l'exemple suivant :

from random import randint, seed

seed(321)

# 100 substrings of 5 characters
lst = [''.join([chr(randint(0, 256)) for _ in range(5)]) for _ in range(100)]

# 50000 strings of 20 characters
strings = [''.join([chr(randint(0, 256)) for _ in range(20)]) for _ in range(50000)]

col = pd.Series(strings)
esc_lst = [re.escape(s) for s in lst]
pattern = '|'.join(esc_lst)
Copier après la connexion

En utilisant cette approche optimisée, l'opération de filtrage prend environ 1 seconde pour 50 000 lignes et 100 sous-chaînes, ce qui est nettement plus rapide que la méthode décrite dans la question d'origine. La différence de performances devient encore plus prononcée pour les trames de données et les listes de sous-chaînes plus grandes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal