Filtrer les Valeurs d’une Colonne d’une Dataframe qui ne Contiennent pas un Mot

Dans Excel, la possibilité de filtrer les colonnes est un atout très avantageux lorsqu’il s’agit de sélectionner uniquement les lignes répondant à un critère donné.

Avec Python et les dataframes que l’on manipule avec Pandas, il arrive que l’on veuille également filtrer les valeurs d’une colonne. Par exemple, si une colonne contient des chaînes de caractères, on peut vouloir sélectionner uniquement les entrées dont l’attribut ciblé ne contient pas un certain mot.

Plus concrètement, imaginons un exemple simple, pour lequel on aurait une table dont une colonne Prénom/Nom contiendrait les prénoms et noms d’individus, et dont d’autres colonnes fourniraient des informations sur ces individus.

Imaginons à présent que l’on veuille s’intéresser à tous les individus, sauf à ceux qui s’appellent « Bob », alors on aimerait retirer les entrées de la table dont la valeur de Prénom/Nom contient la sous-chaîne de caractères "Bob".

On peut également imaginer des scénarios plus réalistes où l’on chercherait à filtrer des adresses email selon des noms de domaines donnés, ou bien des numéros de téléphone selon des préfixes donnés.

🚩Problème :

Comment filtrer les valeurs d’une colonne d’une dataframe qui ne contiennent pas un mot donné ?

Solution :

La ligne de code suivante permet de récupérer une dataframe new_df dont a retiré les entrées d’une dataframe df pour lesquelles un attribut ciblé colonne ne contient pas un certain mot sous_chaine :

new_df = df[~df[colonne].str.contains(sous_chaine, na=False)]
  • df[colonne].str.contains(sous_chaine, na=False) donne un masque booléen indiquant les lignes pour lesquelles la colonne colonne de la dataframe df contiennent la chaîne de caractères sous_chaine à l’intérieur de leur texte. L’option na=False permet d’ignorer les NaN.
  • ~ permet de prendre la négation du masque de booléen.
  • Finalement, on donne le masque résultant à df pour en extraire les lignes ciblées.

🤠Exemple :

Voici un exemple tout simple dans lequel on va filtrer les entrées de notre table selon un mot.

On commence par instancier une table pour l’exemple

import pandas as pd

df = pd.DataFrame(data={
    "Prénom/Nom": ["Alain Dupont", "Alice Dupont", "Bob Durand", "Claire Martin"],
    "Genre": ["Homme", "Femme", "Homme", "Femme"],
})
Une dataframe df pour l’exemple

Admettons que l’on veuille conserver uniquement les lignes pour lesquelles l’individu n’a pas « Dupont » pour nom de famille :

sous_chaine = "Dupont"
colonne = "Prénom/Nom"
new_df = df[~df[colonne].str.contains(sous_chaine, na=False)]
La dataframe résulante new_df sans « Dupont »

Faisons un deuxième exemple. Cette fois, retirons toutes les entrées pour lesquelles quelqu’un s’appelle « Bob » :

sous_chaine = "Bob"
colonne = "Prénom/Nom"
new_df = df[~df[colonne].str.contains(sous_chaine, na=False)]
La dataframe résultante new_df sans « Bob »

Laisser un commentaire