Maison >développement back-end >Tutoriel Python >Comment puis-je filtrer efficacement un DataFrame Pandas pour plusieurs sous-chaînes, gestion de la casse et des caractères spéciaux ?

Comment puis-je filtrer efficacement un DataFrame Pandas pour plusieurs sous-chaînes, gestion de la casse et des caractères spéciaux ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-05 16:50:12242parcourir

How Can I Efficiently Filter a Pandas DataFrame for Multiple Substrings, Handling Case and Special Characters?

Filtrer efficacement les trames de données Pandas pour plusieurs sous-chaînes

Le filtrage des trames de données pour les sous-chaînes est une tâche courante, mais elle peut devenir coûteuse en termes de calcul avec de grands ensembles de données. Le défi est encore aggravé lorsqu'il s'agit de caractères inhabituels et de correspondances insensibles à la casse.

Problème :

Étant donné une trame de données Pandas avec une colonne de chaîne, filtrer efficacement les lignes telles que la colonne contient au moins une sous-chaîne parmi une liste de sous-chaînes, quelle que soit la casse et la présence de caractères spéciaux.

Inefficace Approche :

L'approche initiale impliquait d'itérer sur chaque sous-chaîne de la liste et d'appliquer la méthode str.contains() avec les indicateurs regex=False et case=False. Bien que cette approche soit simple, elle peut être lente pour les grands ensembles de données.

Approche efficace :

Une solution plus efficace utilise des expressions régulières pour construire un modèle contenant tous les éléments échappés. sous-chaînes jointes par un tube regex |. Ce modèle est ensuite vérifié par rapport à chaque chaîne de la colonne à l'aide de la méthode str.contains().

import re

lst = ['kdSj;af-!?', 'aBC+dsfa?\-', 'sdKaJg|dksaf-*']
esc_lst = [re.escape(s) for s in lst]
pattern = '|'.join(esc_lst)
df[col].str.contains(pattern, case=False)

Cette approche fonctionne beaucoup plus rapidement que l'approche itérative, en particulier pour les grands ensembles de données et les sous-chaînes qui nécessitent une évasion.

Évaluation des performances :

Utilisation d'un ensemble de données avec 50 000 chaînes et 100 sous-chaînes, la méthode proposée prend environ 1 seconde, tandis que la méthode itérative prend environ 5 secondes. Le timing s'améliore encore si l'une des sous-chaînes correspond aux valeurs de la colonne.

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!

Déclaration:
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