Pandas : filtrer efficacement les lignes pour plusieurs sous-chaînes
Le filtrage des trames de données Pandas en fonction de plusieurs sous-chaînes peut être difficile, en particulier lorsque les sous-chaînes contiennent des caractères inhabituels . Cet article fournit une solution efficace utilisant une combinaison de fonctions de correspondance de chaînes regex et pandas.
La liste de sous-chaînes fournie (lst) contient des éléments avec des caractères normaux et spéciaux. Pour les faire correspondre littéralement, nous pouvons échapper à ces caractères spéciaux en utilisant re.escape et les joindre à l'aide d'un tube regex (|).
esc_lst = [re.escape(s) for s in lst] pattern = '|'.join(esc_lst)
Maintenant, nous pouvons vérifier efficacement chaque ligne de la colonne cible (col) contre le modèle utilisant str.contains :
col.str.contains(pattern, case=False)
Cette approche surpasse considérablement la solution originale, qui utilisait des boucles imbriquées et plusieurs str.contains appels.
Comparaison des performances
En utilisant un ensemble de données avec 50 000 chaînes de 20 caractères et 100 sous-chaînes de 5 caractères, la méthode proposée prend environ 1 seconde :
%timeit col.str.contains(pattern, case=False) 1 loop, best of 3: 981 ms per loop
En comparaison, l'approche originale prenait environ 5 secondes sur la même ensemble de données.
Remarque : Les horaires représentent les pires scénarios où il n'y a eu aucune correspondance. La méthode proposée fonctionnera encore mieux lorsqu'il y aura des correspondances, car elle cessera de vérifier les sous-chaînes une fois qu'une correspondance sera trouvée.
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!